3

サブ配列内のすべてのアイテムが同じかどうかを確認しようとしています。たとえば、5x5 のボードがあり、配列の 1 つにすべてが含まれているかどうかを知りたいとします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

しかし、これは単に整数の 1 つがすべてではないかどうかをチェックするだけxです。どんな提案でも大歓迎です。

4

5 に答える 5

2

できるだけ簡単board.map { |row| row.uniq.count == 1 }
#=> [false, true, false, false, false]

uniq配列内の一意の要素を返します。mapここでは、配列を反復処理して、一度に 1 行ずつブロックに渡しています。配列内のすべての要素が同じ (長さが 1)trueの場合に返されます。['x', 'x', 'x', 'x', 'x'].uniq #=> ['x']

ボード内の行にすべての要素が重複しているかどうかを確認したいだけなら、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同じサイズであると仮定すると、これは合理的な仮定のようですが、次のように行うことができます。

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 に答える