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.51
et3.75
sont également des sorties valides pour le cas de test23.45 15 17
? Ils utilisent la même quantité de pièces et sont également à l'intérieur de la gamme.Réponses:
Charbon de bois , 60 octets
Essayez-le en ligne! Prend l'entrée en décimales. Le lien est vers la version détaillée du code. Explication:
Saisissez la facture.
Saisissez les fractions décimales de la pointe et calculez la pointe minimale et maximale.
Commencez avec zéro pourboire.
La chaîne SEXy se développe et
10050.20.10.5.01.0.250.1.05.01
est divisée en groupes de trois caractères et convertie en flottant.Ajoutez autant de dénominations actuelles que nécessaire pour atteindre la pointe minimale.
Retirez une dénomination si la pointe maximale a été dépassée.
Formatez la pointe pour l'affichage.
la source
I
au lieu de﹪%.2f
.JavaScript (ES6), 93 octets
Essayez-le en ligne!
Comment?
Nous calculons récursivement une somme de valeurs de billets / pièces jusqu'à ce qu'elle tombe dans la plage acceptable, en essayant toujours la valeur la plus élevée en premier.
la source
Python 3.x:
266185 octetsUne simple modification de mon exemple de programme dans la question. Notez que la sortie n'est plus formatée pour nécessiter 2 décimales.
Edit: Merci à Jo King de l'avoir réduit.
la source
Java 10,
186185 octetsPrend les pourcentages minimum et maximum en
/100
décimales (c.-15%
à - d.0.15
).-1 octet pour résoudre le problème avec
3.51
une sortie potentielle et jouer au golf pour corriger les erreurs d'arrondi de 1 octet en même temps.Essayez-le en ligne.
Explication:
la source
Nettoyer ,
207156octetsPasser à une fonction a économisé 51 octets, sans surprise.
Essayez-le en ligne!
la source
Python (
264222 octets)Un peu plus de golf.
Essayez-le en ligne!
la source
Perl 6 ,
93 9289 octetsEssayez-le en ligne!
Bloc de code anonyme qui prend trois arguments (prix, pourcentage minimum et pourcentage maximum) et renvoie l'astuce.
la source
Wolfram Language (Mathematica) , 105 octets
Cela donnera toutes les solutions avec un nombre minimal de pièces.
Essayez-le en ligne!
la source
Kotlin , 215 octets
Essayez-le en ligne!
la source
Gelée ,
3332 octetsUn lien monadique acceptant une liste
[cost in cents, [minimum ratio, maximum ratio]]
qui donne un montant de pourboire en cents.Essayez-le en ligne!
Comment?
La première ligne est un lien d'aide qui donne le montant donné moins la plus grande note / pièce de monnaie:
Le nombre d'appels requis pour atteindre zéro est utilisé pour trier la plage des montants de pourboire, puis le plus à gauche est généré:
la source