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.51
e3.75
também são saídas válidas para o caso de teste23.45 15 17
? Eles usam a mesma quantidade de moedas e também estão dentro do intervalo.Respostas:
Carvão , 60 bytes
Experimente online! Aceita entrada como decimais. Link é a versão detalhada do código. Explicação:
Insira a conta.
Insira as frações decimais da ponta e calcule a ponta mínima e máxima.
Comece com ponta zero.
A sequência SEXy se expande para a
10050.20.10.5.01.0.250.1.05.01
qual é dividida em grupos de três caracteres e convertida para flutuar.Adicione a denominação atual necessária para atingir a ponta mínima.
Remova uma denominação se a ponta máxima tiver sido excedida.
Formate a dica para exibição.
fonte
I
vez de﹪%.2f
.JavaScript (ES6), 93 bytes
Experimente online!
Quão?
Calculamos recursivamente uma soma dos valores da nota / moeda até que ela caia dentro do intervalo aceitável, sempre tentando primeiro o valor mais alto.
fonte
Python 3.x:
266185 bytesUma modificação direta no meu programa de exemplo na questão. Observe que a saída não é mais formatada para exigir 2 casas decimais.
Edit: Obrigado a Jo King por torná-lo menor.
fonte
Java 10,
186185 bytesToma as porcentagens mínima e máxima como
/100
decimais (ou seja,15%
como0.15
).-1 byte para corrigir o problema com
3.51
saída potencial e jogar no golfe para corrigir erros de arredondamento em 1 byte ao mesmo tempo.Experimente online.
Explicação:
fonte
Limpo ,
207156 bytesTrocar para uma função economizou 51 bytes, sem surpresa.
Experimente online!
fonte
Python (
264222 bytes)Um pouco mais de golfe.
Experimente Online!
fonte
Perl 6 ,
93 9289 bytesExperimente online!
Bloco de código anônimo que usa três argumentos (preço, porcentagem mínima e porcentagem máxima) e retorna a dica.
fonte
Wolfram Language (Mathematica) , 105 bytes
Isso fornecerá todas as soluções com contagem mínima de moedas.
Experimente online!
fonte
Kotlin , 215 bytes
Experimente online!
fonte
Geléia ,
3332 bytesUm link monádico que aceita uma lista
[cost in cents, [minimum ratio, maximum ratio]]
que gera uma quantia de gorjeta em centavos.Experimente online!
Quão?
A primeira linha é um elo auxiliar que gera a quantia dada menos a maior nota / moeda denominada:
O número de chamadas necessárias para atingir zero é usado para classificar o intervalo de valores das gorjetas e, em seguida, o mais à esquerda é gerado:
fonte