Troco

Troco

Médio

Introdução

Na vila mística de Coinholt, você está atrás do balcão da sua padaria, arrumando uma fornada fresca de doces. A porta abre com um rangido, e entra Denara, uma mercadora habilidosa, com bom olho para mercadorias de qualidade. Depois de uma refeição rápida, ela desliza uma moeda reluzente pelo balcão, que vale 100 unidades.

Você sorri, pega a moeda e dá uma olhada no custo total da refeição: 88 unidades. Ou seja, você precisa devolver 12 unidades de troco.

Denara estende a mão, na expectativa. "Me dê só o menor número de moedas", ela diz com um sorriso. "Minha bolsa já está cheia, e não quero correr o risco de perdê-las pelo caminho."

Você sabe que tem algumas opções. "Temos Lumis (vale 10 unidades), Viras (vale 5 unidades) e Zenth (vale 2 unidades) disponíveis para troco."

Você calcula rapidamente as possibilidades de cabeça:

  • uma Lumis (1 × 10 unidades) + uma Zenth (1 × 2 unidades) = 2 moedas no total
  • duas Viras (2 × 5 unidades) + uma Zenth (1 × 2 unidades) = 3 moedas no total
  • seis Zenth (6 × 2 unidades) = 6 moedas no total

"A melhor escolha são duas moedas: uma Lumis e uma Zenth", você diz, entregando o troco a ela.

Denara sorri, claramente impressionada. "Como sempre, você acertou."

Instruções

Determine o menor número de moedas a serem dadas a um cliente, de modo que a soma dos valores delas seja igual ao valor correto do troco.

Exemplos

  • Uma quantia de 15 com os valores de moedas disponíveis [1, 5, 10, 25, 100] deve retornar uma moeda de valor 5 e uma moeda de valor 10, ou [5, 10].
  • Uma quantia de 40 com os valores de moedas disponíveis [1, 5, 10, 25, 100] deve retornar uma moeda de valor 5, uma moeda de valor 10 e uma moeda de valor 25, ou [5, 10, 25].

Mensagens de exceção

Às vezes é necessário lançar uma exceção. Quando você faz isso, deve sempre incluir uma mensagem de erro significativa para indicar qual é a origem do erro. Isso deixa seu código mais legível e ajuda bastante na depuração. Quando você sabe que a origem do erro é de um tipo específico, pode optar por lançar um dos tipos de erro internos, mas ainda assim deve incluir uma mensagem significativa.

Este exercício em particular pede que você use a instrução raise para "lançar" um ValueError quando não for possível fazer o troco com as moedas dadas. Os testes só vão passar se você fizer raise da exception e incluir uma mensagem junto.

Para lançar um ValueError com uma mensagem, escreva a mensagem como argumento para o tipo exception:

# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")
Editar via GitHub O link abre em uma nova janela ou aba
Python Exercism

Tudo pronto para começar Troco?

Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.