【问题标题】:.each not iterating over nested arrays.each 不迭代嵌套数组
【发布时间】:2018-01-02 15:01:08
【问题描述】:

由于某种原因,这不是对集合的迭代。在那里进行撬动表明只有第一个索引被查看。 [0,1,2]我肯定只是累了,有点小,但我这里画的是黑色的,

WIN_COMBINATIONS = [
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8],
  [0, 3, 6],
  [1, 4, 7],
  [2, 5, 8],
  [0, 4, 8],
  [2, 4, 6]
]

def won?(board)
  WIN_COMBINATIONS.each do |combo|
    if board[combo[0]] != " " && board[combo[0]] == board[combo[1]] && board[combo[0]] == board[combo[2]]
      return combo
    else
      return false
    end
  end
end

【问题讨论】:

  • 您将什么参数传递给您的won? 方法?
  • @MarekLipka 这是一个数组。测试中的board = ["O", "O", " ", "X", "X", "X", " ", " ", " "] 是它通过的地方。

标签: ruby each


【解决方案1】:
def won?(board)
  WIN_COMBINATIONS.any? do |combo|
    board[combo[0]] != " " &&
      board[combo[0]] == board[combo[1]] &&
      board[combo[0]] == board[combo[2]]
  end
end

或者,更简洁的是Array#values_at

def won?(board)
  WIN_COMBINATIONS.any? do |combo|
    [%w|X| * 3, %w|O| * 3].include? board.values_at(*combo)
  end
end

【讨论】:

  • @mike-heft 在您的实际代码中,您应该使用它。这是更惯用的红宝石
  • ...或arr = board.values_at(*combo).uniq; arr.size == 1 && arr.first != ' '
  • @CarySwoveland 你可能想检查这个答案的以前版本:)
  • 啊,是的。我更喜欢你以前的版本。添加一个变量和第二条语句以删除select 子句是imo a wash,但主要是,我认为前面的那个更好。
  • 你可以让你的第二个版本更加简洁:def won?(board) false end:-P
【解决方案2】:

原因是您在第一次迭代时从您的方法返回。
在您的迭代中,您总是在第一步之后返回。只需在迭代后加上 return false 语句,它就会起作用。

【讨论】:

  • 是的,就是这样。刚回来回答谢谢:D
【解决方案3】:

只有另外三个解决方案以及测试代码相互检查:

def won1?(board)
  WIN_COMBINATIONS.any? do |i, j, k|
    board[i] != " " && board[i] == board[j] && board[i] == board[k]
  end
end

def won2?(board)
  WIN_COMBINATIONS.any? do |combo|
    a, b = board.values_at(*combo).minmax; a != " " && a == b
  end
end

def won3?(board)
  WIN_COMBINATIONS.any? do |combo|
    [["X"], ["O"]].member?(board.values_at(*combo).uniq)
  end
end

WIN_COMBINATIONS = [
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8],
  [0, 3, 6],
  [1, 4, 7],
  [2, 5, 8],
  [0, 4, 8],
  [2, 4, 6]
]

a = ["O", "X", " "]
a.product(*([a] * 8)).each { |board|
  w1 = won1?(board)
  w2 = won2?(board)
  w3 = won3?(board)
  p [w1, w2, w3, board] if w2 != w1 || w3 != w1
}

【讨论】:

  • 另一个:WIN_COMBINATIONS.any? {|combo| ["X", "O"].one? {|token| combo.all? {|i| board[i] == token}}
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 2013-03-15
  • 2021-02-16
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2021-10-01
相关资源
最近更新 更多