En la mística aldea de Coinholt, estás detrás del mostrador de tu panadería, colocando una nueva tanda de bollería. La puerta se abre con un chirrido y entra Denara, una hábil comerciante con buen ojo para los productos de calidad. Tras una comida rápida, desliza por el mostrador una moneda reluciente que representa un valor de 100 unidades.
Sonríes, coges la moneda y echas un vistazo al coste total de la comida: 88 unidades. Eso significa que tienes que devolver 12 unidades de cambio.
Denara extiende la mano esperando. «Dame las menos monedas posibles», dice con una sonrisa. «Mi bolsa ya está llena y no quiero arriesgarme a perderlas por el camino.»
Sabes que tienes varias opciones. «Tenemos Lumis (valor 10 unidades), Viras (valor 5 unidades) y Zenth (valor 2 unidades) para dar el cambio.»
Calculas rápidamente las posibilidades en tu cabeza:
«La mejor opción son dos monedas: un Lumis y un Zenth», dices mientras le entregas el cambio.
Denara sonríe, claramente impresionada. «Como siempre, has acertado.»
Determina el menor número de monedas que hay que dar a un cliente para que la suma de sus valores sea igual a la cantidad correcta de cambio.
A veces es necesario lanzar una excepción. Cuando lo hagas, deberías incluir siempre un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda enormemente a la hora de depurar. En los casos en los que sepas que el origen del error va a ser de un tipo concreto, puedes optar por lanzar uno de los tipos de error integrados, pero aun así deberías incluir un mensaje significativo.
Este ejercicio en concreto requiere que uses la instrucción raise para «lanzar» un ValueError cuando no se pueda dar el cambio con las monedas dadas. Los tests solo pasarán si usas raise con la exception y además incluyes un mensaje con ella.
Para lanzar un ValueError con un mensaje, escribe el mensaje como argumento del tipo exception:
# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.