if语句中的多个条件Ruby

时间:2015-04-27 04:18:47

标签: ruby arrays multidimensional-array

我想为我的嵌套数组运行一个条件语句:

mark = 'x'
array = [['x', 44, 71, 8, 88],
         [22, 'x', 75, 65, 73],
         [83, 85, 'x', 89, 57],
         [25, 31, 96, 'x', 51],
         [75, 70, 54, 80, 'x']]

我想检查一下x's的向下模式。以下是我尝试使用的代码:

def back_slash?
    if array[0][0].include?(mark) &&
      array[1][1].include?(mark) &&
      array[2][2].include?(mark) &&
      array[3][3].include?(mark) &&
      array[4][4].include?(mark) &&
      return true
    else
      return false
    end
  end

我很新,但想到如果满足所有这些条件,它就会显示为真。我遇到的唯一问题是错误:

my_solution.rb:119: syntax error, unexpected keyword_end
my_solution.rb:166: syntax error, unexpected end-of-input, expecting keyword_end

我从北极到南极洲试过end's ......不知道我错过了什么。

4 个答案:

答案 0 :(得分:2)

# \ diagonal
array.size.times.all? { |i| array[i][i] == mark }

在你提出另一个问题之前,另一个对角线是:

# / diagonal
array.size.times.all? { |i| array[i][array.size - i - 1] == mark }

以前的那些:

# - horizontal
array.any? { |row| row.all? { |element| element == mark } }

# | vertical
array.transpose.any? { |column| column.all? { |element| element == mark } }

请注意,说您正在测试特定字符,而不是让所有位置都相等,这使得提供的所有解决方案here变得更加简单。

答案 1 :(得分:1)

以下行看错了,

array[4][4].include?(mark) &&

删除&&

答案 2 :(得分:1)

require 'matrix'

val = Matrix[*array].each(:diagonal).to_a.uniq
  #=> ["x"] 
val.size == 1 && val.first == mark
  #=> true

答案 3 :(得分:-1)

如果你注意你的代码,你可以认为这里的if/else构造没有必要 - 它实际上是非惯用的。 if正在测试的条件是定义方法返回值的条件,因此您可以实际定义它:

def back_slash?
  array[0][0].include?(mark) &&
  array[1][1].include?(mark) &&
  array[2][2].include?(mark) &&
  array[3][3].include?(mark) &&
  array[4][4].include?(mark)
end

您可以将其视为:"将back_slash?定义为array[0][0],其中包含标记 array[1][1],其中包含标记...& #34;

您可以使用其他答案中的建议之一来进一步改善您的逻辑。