arrays - 检查一个数组中的所有字符串是否都在另一个数组中

标签 arrays ruby

这是一款井字游戏。我有一个包含九个字符串元素的数组 board,以及一个包含来自 board 的位置组合的嵌套数组 WIN_COMBINATIONS:

board = ["X", "X", "X", " ", " ", " ", " ", " ", " "]

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

如何使用 board 中的组合选择全是 "X" 或全是 "O" 的数组组合 WIN_COMBINATIONS?

例如 与上面的棋盘不同,其中 X 在右对角线上获胜。

board = ["X", "O", "X", "O", "X", "O", "X", "X", "O"]

#  X | O | X
# ---+---+---
#  O | X | O
# ---+---+---
#  X | X | O

won?(board) #=> [2,4,6]

最佳答案

ndn's answer 的细微变化:

board = %w(X O X
           O X O
           X X O)
WIN_COMBINATIONS.select { |c| board.values_at(*c).join =~ /XXX|OOO/ }
#=> [[6, 4, 2]]

解释:

  • select返回 block 返回 true 的所有元素。

  • values_at返回指定索引处的值:

    board.values_at(*[0, 1, 2])
    #=> ["X", "O", "X"]
    

    * 将数组转换为参数列表,所以上面变成了 values_at(0, 1, 2)

  • join返回包含连接元素的字符串:

    ["X", "O", "X"].join
    #=> "XOX"
    
  • =~检查字符串是否与 regular expression 匹配/XXX|OOO/,即 XXXOOO

您可以将 select 替换为 find如果您只想检索第一个获胜组合。

关于arrays - 检查一个数组中的所有字符串是否都在另一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34717897/

相关文章:

c++ - 如何在结构内联中分配字符数组?

ios - Swift - 从 String 获取信息到 NSMutableArray

ruby-on-rails - 如何用西类牙语加载我的 Rails 控制台

ruby - 检查答案是否为空

php文件列表数组转入数组树

javascript - String.charAt() 在循环中返回 undefined

php - 在 Laravel 中使用 Eloquent 通过 Foreach 循环反转数组元素的顺序

ruby-on-rails - 为什么我得到一个未定义的方法 `join' 为 nil :NilClass error?

ruby - 有没有更好的方法来编写这种类型的 nil 检查?

ruby - 如何修复 Ruby 中的 Shebang 警告