You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:54