2017-05-04 12 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にあるとの新しいエラーが発生します。

私の最高の推測は、私が正しく私のifを閉じたり構築していないということです。誰かが私を正しい方向に向けることを望んでいました。

答えて

3

ルビにインクリメント演算子++はありません。その代わりにvalue += 1を使用してください。

で試してみてください:Rubyで

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] 

をあなたはそれはあなたが機能(または範囲)内に置く最後の値になるだろうreturnを指定する必要はありません、また、あなたは配列に変換したい必要がありますあなたの範囲(1..3)、あなたのalphabeta配列をチェックするためにそれのすべてのインデックスを使用しているとき、インデックスが3であるときnilが得られます。代わりに(0..2).to_a

+=の代わりに++を使用し、配列のインデックスを確認するには、角かっこalpha[i]で行うことができます(ドットで書くことやメソッドとして書く必要はありません)。

複数の値を返すには、今回は配列として実行してください。単に「普通の」オブジェクトにはsyntax errorがスローされます。 do_something if this_happens

4

Rubyはインクリメント単項演算子を持っていないよう

if ... then ... endを短縮することができます。代わりにbS+=1を実行します。使用する修正の例として、以下を参照してください。

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 
関連する問題