我想为我的嵌套数组运行一个条件语句:
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
......不知道我错过了什么。
答案 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;
您可以使用其他答案中的建议之一来进一步改善您的逻辑。