Ruby Koans スコアリング プロジェクト

概要

私は Ruby Koan に取り組んでいますが、自分が書いたメソッドの何が問題なのかを理解するのに少し苦労しています。私は about_scoring_project.rb にいて、サイコロ ゲームのスコア メソッドを書きました。

def score(dice)
  return 0 if dice == []
  sum = 0
  rolls = dice.inject(Hash.new(0)) { |result, element| result[element] += 1; result; }
  rolls.each { |key, value| 
    # special condition for rolls of 1
    if key == 1  
      sum += 1000 | value -= 3 if value >= 3
      sum += 100*value
      next
    end
    sum += 100*key | value -= 3 if value >= 3
    sum += 50*value if key == 5 && value > 0
  }
  return sum
end

この演習に慣れていない人のために:

ファイル内の最後のテストを実行しようとすると問題が発生します:assert_equal 550,score([5,5,5,5])

何らかの理由で、550 ではなく 551 を返します。ご協力ありがとうございます。

解決策

私のアプローチでは 2 つのルックアップ テーブルを使用します。1 つはトリプルのスコアを含み、もう 1 つはシングルのスコアを含みます。テーブルを使用して各数値のスコアを計算し、inject を使用して合計を累積します。

def score(dice)
  triple_scores = [1000, 200, 300, 400, 500, 600]
  single_scores = [100, 0, 0, 0, 50, 0]
  (1..6).inject(0) do |score, number|
    count = dice.count(number)
    score += triple_scores[number - 1] * (count / 3)
    score += single_scores[number - 1] * (count % 3)
  end
end