2017-05-04 76 views
0

我正在做的事情hackerrank一个运动在那里我要求比较一组三胞胎的得到分数。我首次提交后,我想尝试一些更优雅(即以较少的条件句说),所以我做了如下代码:如果语句的语法错误,意想不到的keyword_end

def solve(a0, a1, a2, b0, b1, b2) 
    # Complete this function 
    aS = 0 
    bS = 0 

    alpha = [a0, a1, a2] 
    beta = [b0, b1, b2] 

    (1..3).each do |i| 
     if (alpha.(i) > beta.(i)) then aS++ end 
     if (alpha.(i) < beta.(i)) then bS++ end 
    end 

    return aS, bS 

end 

但我发现了以下错误:

solution.rb:12: syntax error, unexpected keyword_end 
.(i) > beta.(i)) then aS++ end 
          ^
solution.rb:13: syntax error, unexpected keyword_end 
.(i) < beta.(i)) then bS++ end 
          ^
solution.rb:31: syntax error, unexpected end-of-input, expecting keyword_end 

如果我删除每条if语句的end,我会得到一个说明语法错误的新错误,意想不到的输入结束,期望keyword_end位于类的end上。

我最好的猜测是,我没有正确关闭或建造我如果,我希望有人能指出我在正确的方向。

回答

3

有Ruby中没有增量运算++,改用value += 1

尝试用:

def solve(a0, a1, a2, b0, b1, b2) 
    aS = 0 
    bS = 0 

    alpha = [a0, a1, a2] 
    beta = [b0, b1, b2] 

    (0..2).to_a.each do |i| 
    aS += 1 if alpha[i] > beta[i] 
    bS += 1 if alpha[i] < beta[i] 
    end 

    [aS, bS] 
end 

p solve(1, 2, 3, 4, 5, 6) 
# => [0, 3] 

在Ruby中,你不需要指定return这将是你把一个函数(或范围)内的最后一个值,也必须要转换成数组您的范围(1..3),和你使用它的每一个指数的alphabeta阵列来检查,你会得到nil当该指数取3号,因为有这些阵列没有索引3,尽量以代替(0..2).to_a

要增加你的初始变量使用+=而不是++,并检查数组的索引,您可以用方括号alpha[i](不需要用点或方法编写)进行数组索引。

要返回多于一个值,试试这个时间做它作为一个数组,只是“普通”的对象会抛出syntax error

if ... then ... end,能够缩短do_something if this_happens

4

Ruby没有增量元运算符。取而代之的是bS+=1。作为修复的一个例子,请看下面的例子irb

irb(main):001:0> x = 2 
=> 2 
irb(main):002:0> if x > 1 then x++ end 
SyntaxError: (irb):2: syntax error, unexpected keyword_end 
    from /opt/chefdk/embedded/bin/irb:11:in `<main>' 
irb(main):003:0> if x > 1 then x+=1 end 
=> 3 
相关问题