Cambio

Cambio

Media

Introducción

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:

  • un Lumis (1 × 10 unidades) + un Zenth (1 × 2 unidades) = 2 monedas en total
  • dos Viras (2 × 5 unidades) + un Zenth (1 × 2 unidades) = 3 monedas en total
  • seis Zenth (6 × 2 unidades) = 6 monedas en total

«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.»

Instrucciones

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.

Ejemplos

  • Una cantidad de 15 con los valores de moneda disponibles [1, 5, 10, 25, 100] debe devolver una moneda de valor 5 y una moneda de valor 10, o [5, 10].
  • Una cantidad de 40 con los valores de moneda disponibles [1, 5, 10, 25, 100] debe devolver una moneda de valor 5, una moneda de valor 10 y una moneda de valor 25, o [5, 10, 25].

Mensajes de excepción

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")
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Python Exercism

¿Listo para empezar Cambio?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.