Skip to content

Instantly share code, notes, and snippets.

@jjballano
Created December 10, 2010 18:57
Show Gist options
  • Save jjballano/736614 to your computer and use it in GitHub Desktop.
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
@jjballano
Copy link
Author

He puesto como dice Kini el "dice" como global, quizás tenga sentido... no lo se, quizás en la próxima iteración lo quite ;)
Un repaso a los nombres... he usado los mismos que en el enunciado. En vez de "group" en el enunciado dice "set of the numbers". No usa la palabra elements así que la he eliminado. Y no se que más cosas...
Me queda un método llamado number_of(number) no me gusta... ¿ideas?
Por cierto, aunque supongo que lo sabreis, pero los test siempre pasan :)

@plagelao
Copy link

Creo que, ahora que lo veo más claro, el método "score" hace demasiadas cosas. Además de sumar la puntuación para cada cara del dado, calcula la puntuación para cada cara del dado. Yo intentaría separar esas responsabilidades (una clase "DiceSide" o algo así, que calcule el resultado para cada cara?
A mi, personalmente, no me gusta lo de "dice" como global. Creo que si aparece el "DiceSide", en realidad el argumento que sobra en los métodos es el "number", no el "dice".
También creo que este es un paso muuuy largo, y que seguro que se puede hacer en pasos chiquitines, pero no se como :(

@jjballano
Copy link
Author

Yo veo eso que dices y esta condición:

if (number_of(number) > 0) and (number == 5 or number == 1)

Me chirría bastante también. Hay que seguir dándole vueltas.
Lo que no termino de ver es lo de que sobre number, te refieres a que tendría que estar como global y que todos leyeran de ahí? Me parece que complica la lectura del código no?

@plagelao
Copy link

Con lo de que sobra number me refiero a que, probablemente, sería una propiedad de la clase "DiceSide". La cara del dado sabe que numero tiene ¿no? :P

@jjballano
Copy link
Author

Ah vale, no había entendido lo de que fuera una clase... i'll think about it!

@kinisoftware
Copy link

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

@jjballano
Copy link
Author

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 :)

@jjballano
Copy link
Author

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á...

@kinisoftware
Copy link

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" :))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment