【问题标题】:Multiple conditions in if statement Rubyif语句Ruby中的多个条件
【发布时间】:2015-04-27 04:18:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 什么是“向下模式”?
  • 从左到右的对角线图案。当我删除 if 语句的结尾时,我仍然得到错误。我没有得到它想要我结束的地方>.
  • 你不应该删除end
  • end 不是问题,它正在寻找另一个条件,因为您在结束之前有一个 &&。它将end 视为该运算符的右轴,这是您不想要的。
  • @jonsnow 给出了答案。我能够让它工作。

标签: ruby arrays multidimensional-array


【解决方案1】:
# \ 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 提供的所有解决方案变得更加简单。

【讨论】:

    【解决方案2】:

    下面的行看起来不对,

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

    删除&&

    【讨论】:

    • 谢谢。这样的小东西我一直在看。
    【解决方案3】:
    require 'matrix'
    
    val = Matrix[*array].each(:diagonal).to_a.uniq
      #=> ["x"] 
    val.size == 1 && val.first == mark
      #=> true
    

    【讨论】:

      【解决方案4】:

      如果您注意您的代码,您会发现这里的 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 未初始化。也许这本来是一种争论。如果将其作为参数,如果整数在对角线上,它仍然会引发异常,因为Fixnum 没有方法include?。例如,您需要array[0][0] == 'x'array[1][1] == 'x' 等,但这样做会很笨拙。在发布之前测试您的代码总是明智的。投反对票是我的。
      • @CarySwoveland 你说得对,我实际上只是复制了 OP 的代码来证明我的观点。如您所见,这个想法只是为了表明if 构造是不必要的,这个定义将归结为最初提出的解决方案。但无论如何,你是对的,我没有注意实际的语义。也许我应该删除答案并将该评论添加为对该问题的评论。
      猜你喜欢
      • 2021-03-07
      • 2015-01-20
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多