3

尝试检查子数组中的所有项目是否相同。例如,我有一个 5x5 板,我想知道其中一个数组是否包含所有x's

board =     [[47, 44, 71, 8, 88],
        ['x', 'x', 'x', 'x', 'x'],
      # [83, 85, 97, 'x', 57],
        [83, 85, 97, 89, 57],
        [25, 31, 96, 68, 51],
        [75, 70, 54, 80, 83]]

我目前有:

def check_x
  board.each do |x|
   return true if x.include?('x')
  end
   return false
end

但这只会检查整数之一是否是x而不是全部。任何建议将不胜感激。

4

5 回答 5

6

更地道一点:

board.one? { |row| row.all? { |item| item == 'x' } }

于 2015-04-26T20:34:26.237 回答
2

尽可能board.map { |row| row.uniq.count == 1 }简单
#=> [false, true, false, false, false]

uniq返回数组中的唯一元素。map这是迭代您的数组并一次将一行传递给块。它将返回true数组中所有元素都相同(['x', 'x', 'x', 'x', 'x'].uniq #=> ['x']长度为 1)的情况

如果您只想检查板中的任何行是否包含所有重复元素,则 ruby​​ 仅具有一个功能。你猜怎么着?any?. 只需将上面的单线更改any?为:

board.any? { |row| row.uniq.count == 1 } #=> true

如果您想找出哪些行有/有所有重复项,以及它有哪些重复项:

board.each.with_index.select { |row, index| row.uniq.count == 1 }
#=> [[["x", "x", "x", "x", "x"], 1]], where 1 is index.

纯粹的红宝石真棒。

于 2015-04-26T20:33:50.733 回答
0

如果数组中的所有元素都相同,则意味着最大值和最小值相等。对于您的电路板,您可以使用这一行找到所需子阵列的索引

board.each {|b| puts board.index(b) if b.max == b.min}

或者只是在你的函数中替换x.include?("x")x.min == x.max真/假结果

于 2015-04-26T21:58:16.353 回答
0

假设(板的行)的所有元素board大小相同,这似乎是一个合理的假设,您可以这样做:

x_row = ['x']*board.first.size
  #=> ["x", "x", "x", "x", "x"] 
board.any? { |row| row == x_row }
  #=> true
于 2015-04-27T02:21:34.457 回答
0

假设它总是一个固定长度的数组,你的方法可以是:

def full_row
  board.each do |row| 
    return true if (row.uniq.count == 1) && (row[0] == 'x')
  end

  return false
end

这可以归结为更少的行,但我讨厌在 vim 中换行:p

于 2015-07-27T17:43:25.580 回答