-
-
Save jjballano/736614 to your computer and use it in GitHub Desktop.
SCORE_OF = {1=>100, 2=>0, 3=>0, 4=>0, 5=>50, 6=>0} | |
SCORE_OF_A_SET_OF_THREE = {1=>1000, 2=>200, 3=>300, 4=>400, 5=>500, 6=>600} | |
def score(dice) | |
score = 0 | |
(1..6).each{ |number| | |
score += score_of_set_of(number, dice) | |
} | |
return score | |
end | |
def score_of_set_of(number, dice) | |
score = 0 | |
score += score_of_sets_of_three(number, dice) | |
score += score_of_set_of_less_than_three(number, dice) | |
return score | |
end | |
def number_of(number, dice) | |
return dice.select { |element| element == number}.size | |
end | |
def score_of_sets_of_three(number, dice) | |
return SCORE_OF_A_SET_OF_THREE[number] * number_of_sets_of_three(number_of(number,dice)) | |
end | |
def score_of_set_of_less_than_three(number, dice) | |
return SCORE_OF[number] * number_of_no_set_of_three(number_of(number, dice)) | |
end | |
def number_of_sets_of_three(number_of_elements) | |
number_of_elements / 3 | |
end | |
def number_of_no_set_of_three(number_of_elements) | |
number_of_elements % 3 | |
end |
De acuerdo con lo que decís. El tema de poner cosas globales a mi tampoco me gusta, era una propuesta/sugerencia a tener en cuenta pero no conozco el lenguaje ni la forma de poder hacerlo. Quizás, siguiendo con lo que dice Alberto, estaría bien una clase DiceSide con un "value" o "number" (DiceSide.number).
Mi propuesta para "number_of(number)" sería "recurrence_of(number)"... o algo así ;) pero le falta semántica (reaparición del número, donde?) un "recurrence_of_dice_side_in_throw()" o "recurrence_in_throw_of(diceside)".... venga, quién da más! :D
Siguiente aproximación hecha a partir de alguno de vuestros comentarios. Se reduce el código y parece más legible. Me siguen faltando cosas que decís, como tema naming, el DiceSice (que no termino de ver cómo meterlo sin liarla más), el método score parece que no cumple con una única responsabilidad...
De momento ya me he quitado el if ese que no me gustaba :)
De todas formas, estoy viendo que hay algo que no cambié porque venía así, pero es que venía mal... en el método score, el parámetro se llama "dice" cuando realmente no es un dado, es el resultado de haber lanzado el dado X veces... seguramente cambiando eso ya vea mejor como meter una clase Dice o DiceSide o ya se verá...
Yay! Me gusta más este código! :D
Es cierto lo del "dice", realmente es una "throw" (tirada... que lo pone en el diccionario mayormente :P). Igual así se puede sacar más semántica, quizás cada tirada está formada por "diceside" o "dicevalue"... podría no hacerse como una clase claro pero entonces no estamos siendo todo lo orientado a objetos que podríamos ;) (esto lo aprendí bien en el curso de TDD con Alejandro, no había primitivos salvo en las clases más bajas, en este caso DiceSide tiene un primitivo "value" :))
Ah vale, no había entendido lo de que fuera una clase... i'll think about it!