La plupart des applications de calcul de pourboire prennent simplement un pourcentage fixe du prix du repas. Ainsi, par exemple, si votre repas est de 23,45 $, vous pouvez laisser un pourboire de 15% = 3,52 $, ou un pourboire plus généreux de 20% = 4,69 $.
Assez pratique pour les utilisateurs de cartes de crédit. Mais ce n'est pas le cas si vous préférez laisser des pourboires en espèces, auquel cas ces montants excentriques vous gênent. Modifions donc l'idée pour qu'elle soit plus pratique pour les utilisateurs de cash.
Votre affectation
Écrivez, en un minimum d'octets, un programme ou une fonction qui prend en entrée:
- Prix du repas
- Pourcentage minimum de pourboire
- Pourcentage maximum de pourboire
Et produisez n'importe quel montant de pourboire dans la plage [prix * min_percentage / 100, prix * max_percentage / 100] qui minimise le nombre de billets / billets et pièces requis.
Supposons les coupures monétaires américaines de 1 ¢, 5 ¢, 10 ¢, 25 ¢, 1 $, 5 $, 10 $, 20 $, 50 $ et 100 $.
Exemple
Voici un exemple de programme non golfé en 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)))
Quelques exemples d'entrées et de sorties:
~$ 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)Est-ce destiné à remplacer nos valeurs par défaut pour les entrées et les sorties? C'est-à-dire, par exemple, une fonction qui prend trois nombres et renvoie le résultat serait-elle autorisée?
3.51et 3.75sont également des sorties valides pour le cas de test 23.45 15 17? Ils utilisent la même quantité de pièces et sont également à l'intérieur de la gamme.