Cambio

Cambio

Intermedia

Introducción

En la mística aldea de Coinholt, estás detrás del mostrador de tu panadería, acomodando un lote recién hecho de pastelillos. La puerta se abre con un chirrido y entra Denara, una comerciante hábil con muy buen ojo para los productos de calidad. Después de una comida rápida, desliza sobre el mostrador una moneda reluciente que representa un valor de 100 unidades.

Sonríes, tomas la moneda y le echas un vistazo al costo total de la comida: 88 unidades. Eso significa que debes devolver 12 unidades de cambio.

Denara extiende la mano con expectativa. «Solo dame la menor cantidad de monedas», dice con una sonrisa. «Mi bolsa ya está llena y no quiero arriesgarme a perderlas en el camino».

Sabes que tienes algunas opciones. «Tenemos Lumis (vale 10 unidades), Viras (vale 5 unidades) y Zenth (vale 2 unidades) disponibles para dar 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, acertaste».

Instrucciones

Determina la menor cantidad de monedas que debes darle a un cliente para que la suma de sus valores sea igual al cambio correcto.

Ejemplos

  • Un monto 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].
  • Un monto 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, siempre debes incluir 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 mucho a la hora de depurar. En los casos en los que sabes que el origen del error será de un tipo determinado, puedes elegir lanzar uno de los tipos de error integrados, pero aun así debes incluir un mensaje significativo.

Este ejercicio en particular requiere que uses la sentencia raise para «lanzar» una ValueError cuando no se pueda formar el cambio con las monedas dadas. Las pruebas solo pasarán si lanzas la exception con raise y además incluyes un mensaje con ella.

Para lanzar una ValueError con un mensaje, escribe el mensaje como argumento del tipo de 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 una pestaña nuevas
Python Exercism

¿Todo listo para empezar Cambio?

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