Ruby中Turn类guess方法返回结果不符预期的修正咨询
问题分析
你的代码逻辑方向错误:当前是遍历密码的每个元素来判断匹配情况,而不是遍历猜测的每个元素。这导致猜测数组的第四个元素(GREEN)根本没被处理,反而去检查密码的第四个元素(YELLOW)是否存在于猜测中——显然猜测里没有YELLOW,所以这一步不会添加任何结果,最终输出少了一个元素。
修改方案
将循环对象从passcode改为colors,逐个处理猜测的每个元素,判断其与密码的匹配情况:
class Turn def initialize(passcode:) @passcode = passcode end def guess(colors) result = [] # 遍历猜测数组的每个元素及索引 colors.each_with_index do |guess_color, idx| if passcode[idx] == guess_color result << :exact elsif passcode.include?(guess_color) result << :partial end end result end private attr_reader :passcode end passcode = ["RED", "GREEN", "BLUE", "YELLOW"] player = Turn.new(passcode: passcode) p player.guess(["RED", "GREEN", "BLUE", "GREEN"]) # 输出:[:exact, :exact, :exact, :partial]
补充说明(严格遵循Mastermind规则)
上面的修改满足你当前的预期,但如果密码或猜测中存在重复颜色,会出现逻辑问题。比如密码是["GREEN", "GREEN", "RED"],猜测是["GREEN", "GREEN", "GREEN"],上面的代码会返回[:exact, :exact, :partial],但实际上密码只有两个GREEN,第三个猜测的GREEN没有对应的密码元素,不应返回partial。
如果需要严格遵循Mastermind游戏规则(避免重复计算已匹配的颜色),可以使用以下版本:
class Turn def initialize(passcode:) @passcode = passcode end def guess(colors) remaining_passcode = passcode.dup result = Array.new(colors.size) # 第一步:处理精确匹配,同时移除已匹配的密码元素 colors.each_with_index do |guess_color, idx| if passcode[idx] == guess_color result[idx] = :exact remaining_passcode.delete_at(idx) end end # 第二步:处理部分匹配,避免重复使用已匹配的密码元素 result.each_with_index do |res, idx| next unless res.nil? guess_color = colors[idx] if remaining_passcode.include?(guess_color) result[idx] = :partial remaining_passcode.delete(guess_color) end end result.compact end private attr_reader :passcode end
内容的提问来源于stack exchange,提问作者Adesuyi Fisola
相关产品推荐
相关产品推荐

