public
Last active

implementation of about_scoring_project ruby koan

  • Download Gist
score.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
def score(dice)
return score_for_each_die(dice) + score_for_sets_of_three(dice)
end
 
def score_for_each_die(dice)
dice.inject(0) do |sum, die|
sum + score_for(die)
end
end
 
def score_for die
return 100 if die == 1
return 50 if die == 5
return 0
end
 
def score_for_sets_of_three(dice)
(1..6).inject(0) do |sum, value|
sum + score_for_sets_of_three_of(value, dice)
end
end
 
def score_for_sets_of_three_of value, dice
number_of_sets = number_of_sets_of_three_for value, dice
score_for_a_set = score_for_a_set_of value
return number_of_sets * score_for_a_set
end
 
SCORE_FOR_A_SET_OF_THREE = { 1 => 700, 2 => 200, 3 => 300, 4 => 400, 5 => 350, 6 => 600 }
 
def score_for_a_set_of value
return SCORE_FOR_A_SET_OF_THREE[value]
end
 
def number_of_sets_of_three_for value, dice
times_repeated = dice.find_all { |die| die == value }.size
groups_of_three = times_repeated / 3
end

Por un momento he pensado que la implementación no funcionaba :P Luego he visto el 700 cuando tienes 3 unos. No veas si es listo el algoritmo :P
Una de las cosas que estoy aprendiendo ultimamente es a no hacer código listo (En realidad, todavía no la he aprendido. Yo lo intento, pero es difícil) porque luego no es claro (más o menos lo que me ha pasado a mi leyendo el tuyo).

Un saludo

Gracias por el comentario, lo primero.

Entiendo lo que dices, pero no sé si lo comparto. No creo que el código trate de ser demasiado "listo". Es simplemente una implementación algo diferente, lo cual no me parece relevante. Si los tests pasan y el código es simple... ¿dónde está el problema?

Otra cosa es que este código no funcione con el juego completo (acabo de leerlo hoy) donde se van quitando dados...

Un saludo

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.