如何收集用户输入并提供反馈

时间:2017-01-31 16:51:09

标签: arrays ruby compare

我正在努力使用我的代码编写一个简单的代码破解游戏。 有一个隐藏的代码:

UnknownHostException

我的程序要求输入用户,然后将其存储在变量中。 我想将用户输入与密码变量进行比较并给出用户反馈:1表示好的字母,0表示错误的字母,“ - ”表示错误的字母。

我想出了类似的东西:

code = ["a","b","b","c"]

在比较同一索引处的元素时,它可以正常工作。我不知道如何找到代码数组中的元素,但不能在同一索引中找到并向用户提供反馈。

例如:

feedback = []
input.each_with_index do |v,i|
  if v == code.fetch(i)
    feedback << "1"
  else
    feedback << "-"
  end
end

5 个答案:

答案 0 :(得分:1)

此代码适用于您提到的3个示例。

使用了2次传递,因为必须在1之前返回0

def give_feedback(input, code)
  feedback = Array.new(input.size) { '-' }
  code2 = code.dup

  input.each_with_index do |letter, index|
    if letter == code[index]
      feedback[index] = '1'
      code2[index]    = nil
    end
  end

  input.each_with_index do |letter, index|
    next if feedback[index] == '1'
    found = code2.index(letter)
    if found
      feedback[index]  = '0'
      code2[found]     = nil
    end
  end
  feedback
end

p give_feedback(%w(b b a z), %w(a b b c))
# ["0", "1", "0", "-"]
p give_feedback(%w(a a a a), %w(a b b c))
# ["1", "-", "-", "-"]
p give_feedback(%w(c c b a), %w(a b b c))
# ["0", "-", "1", "0"]

答案 1 :(得分:0)

您可以使用include?方法查看该字符是否位于不同索引的列表中。像这样:

input.each_with_index do |v,i|
  if v == code.fetch(i)
    feedback << "1"
  elsif code.include?(v)
    # right character, wrong spot
    feedback << "0"
  else
    feedback << "-"
  end
end

答案 2 :(得分:0)

还有一个解决方案

code = ["a","b","b","c"]
input = ["b","b","a","z"]

feedback = input.map.with_index do |num, ind|
  if code.include? num
    code[ind] == num ? '1' : '0'
  else
    '-'
  end
end

=> ['0', '1', '0', '-']

如果您之前要定义feedback,只需将第一个版本编辑为:

code = ["a","b","b","c"]
input = ["b","b","a","z"]
feedback = []

input.each_with_index do |num, ind|
  if code.include? num
    feedback << (code[ind] == num ? '1' : '0')
  else
    feedback << '-'
  end
end

结果将是相同的

答案 3 :(得分:0)

您可以使用zipmap使其更具功能性。 include?会检查输入是否在code

code = %w(a b b c)
input = %w(b b a z)
result = code.zip(input).map do |c, i|
  if c == i
    '1'
  elsif code.include?(i)
    '0'
  else
    '-'
  end
end
puts result.to_s

答案 4 :(得分:0)

出于好奇:

[code, input].map { |a| (0...a.size).zip(a).to_h }
             .reduce do |e, acc|
  c = acc.values.dup
  acc.merge(e) do |_, v1, v2|
    case (c.delete_at(c.index(v2)) rescue nil)
    when v1 then "1"
    when nil then "-"
    else "0"
    end
  end
end.values