A maioria dos aplicativos de calculadora de gorjetas simplesmente cobra uma porcentagem fixa do preço da refeição. Assim, por exemplo, se a sua refeição for $ 23,45, você pode deixar uma gorjeta de 15% = $ 3,52 ou uma gorjeta mais generosa de 20% = $ 4,69.
Conveniente o suficiente para usuários de cartão de crédito. Mas não é assim, se você preferir deixar gorjetas em dinheiro, caso em que esses montantes excêntricos ficarão no caminho. Então, vamos modificar a ideia para ser mais conveniente para usuários de dinheiro.
Sua tarefa
Escreva, no menor número possível de bytes, um programa ou função que use como entrada:
- Preço da refeição
- Percentual mínimo de gorjeta
- Porcentagem máxima da ponta
E produza qualquer valor de gorjeta dentro do intervalo [price * min_percentage / 100, price * max_percentage / 100] que minimiza o número de notas / notas e moedas necessárias.
Suponha as denominações monetárias dos EUA de 1, 5, 10, 25, US $ 1, US $ 5, US $ 10, US $ 20, US $ 50 e US $ 100.
Exemplo
Aqui está um programa de exemplo sem golfe no Python:
import math
import sys
# Do the math in cents so we can use integer arithmetic
DENOMINATIONS = [10000, 5000, 2000, 1000, 500, 100, 25, 10, 5, 1]
def count_bills_and_coins(amount_cents):
# Use the Greedy method, which works on this set of denominations.
result = 0
for denomination in DENOMINATIONS:
num_coins, amount_cents = divmod(amount_cents, denomination)
result += num_coins
return result
def optimize_tip(meal_price, min_tip_percent, max_tip_percent):
min_tip_cents = int(math.ceil(meal_price * min_tip_percent))
max_tip_cents = int(math.floor(meal_price * max_tip_percent))
best_tip_cents = None
best_coins = float('inf')
for tip_cents in range(min_tip_cents, max_tip_cents + 1):
num_coins = count_bills_and_coins(tip_cents)
if num_coins < best_coins:
best_tip_cents = tip_cents
best_coins = num_coins
return best_tip_cents / 100.0
# Get inputs from command-line
meal_price = float(sys.argv[1])
min_tip_percent = float(sys.argv[2])
max_tip_percent = float(sys.argv[3])
print('{:.2f}'.format(optimize_tip(meal_price, min_tip_percent, max_tip_percent)))
Alguma amostra de entrada e saída:
~$ python tipcalc.py 23.45 15 20
4.00
~$ python tipcalc.py 23.45 15 17
3.55
~$ python tipcalc.py 59.99 15 25
10.00
~$ python tipcalc.py 8.00 13 20
1.05
a program that takes as input (stdin, command-line arguments, or GUI input box, whichever is most convenient in your language)Isso pretende substituir nossos padrões de entradas e saídas? Ou seja, por exemplo, seria permitida uma função que pega três números e retorna o resultado?
3.51e 3.75também são saídas válidas para o caso de teste 23.45 15 17? Eles usam a mesma quantidade de moedas e também estão dentro do intervalo.