Die meisten Trinkgeldrechner-Apps nehmen einfach einen pauschalen Prozentsatz des Essenspreises ein. Wenn Ihre Mahlzeit beispielsweise 23,45 USD beträgt, können Sie ein Trinkgeld von 15% = 3,52 USD oder ein großzügigeres Trinkgeld von 20% = 4,69 USD hinterlassen.
Praktisch genug für Kreditkartenbenutzer. Aber nicht, wenn Sie lieber Bargeld-Trinkgelder abgeben möchten. In diesem Fall behindern Sie diese seltsamen Cent-Beträge. Ändern wir also die Idee, um sie für Bargeldbenutzer angenehmer zu gestalten.
Ihre Aufgabe
Schreiben Sie in so wenigen Bytes wie möglich ein Programm oder eine Funktion , die als Eingabe verwendet wird:
- Preis der Mahlzeit
- Minimaler Trinkgeldanteil
- Maximaler Trinkgeldanteil
Und geben Sie einen beliebigen Trinkgeldbetrag im Bereich [Preis * Mindestprozentsatz / 100, Preis * Höchstprozentsatz / 100] aus, der die Anzahl der erforderlichen Scheine / Banknoten und Münzen minimiert.
Angenommen, die US-Währungsbezeichnungen lauten 1, 5, 10, 25, 1, 5, 10, 20, 50 und 100 US-Dollar.
Beispiel
Hier ist ein nicht-golfendes Beispielprogramm in 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)))
Einige Beispieleingaben und -ausgaben:
~$ 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)
Soll dies unsere Standardeinstellungen für Ein- und Ausgänge überschreiben? Das heißt, wäre z. B. eine Funktion zulässig, die drei Zahlen akzeptiert und das Ergebnis zurückgibt?3.51
und3.75
sind das auch gültige Ausgaben für den Testfall23.45 15 17
? Sie verbrauchen die gleiche Menge an Münzen und befinden sich ebenfalls innerhalb der Reichweite.Antworten:
Kohle , 60 Bytes
Probieren Sie es online! Nimmt Eingaben als Dezimalstellen. Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie die Rechnung ein.
Geben Sie die Spitzen-Dezimalbrüche ein und berechnen Sie die minimale und maximale Spitze.
Beginnen Sie mit der Nullspitze.
Die SEXy-Zeichenfolge wird erweitert und
10050.20.10.5.01.0.250.1.05.01
in Gruppen mit drei Zeichen aufgeteilt und in Floating umgewandelt.Fügen Sie so viele Stückelungen wie nötig hinzu, um die minimale Spitze zu erreichen.
Entfernen Sie eine Stückelung, wenn die maximale Spitze überschritten wurde.
Formatieren Sie den Tipp für die Anzeige.
quelle
I
anstelle von﹪%.2f
.JavaScript (ES6), 93 Byte
Probieren Sie es online!
Wie?
Wir berechnen rekursiv eine Summe von Banknoten- / Münzenwerten, bis sie in den akzeptablen Bereich fällt, wobei immer der höchste Wert zuerst versucht wird.
quelle
Python 3.x:
266185 BytesEine unkomplizierte Änderung meines Beispielprogramms in der Frage. Beachten Sie, dass die Ausgabe nicht mehr so formatiert ist, dass 2 Dezimalstellen erforderlich sind.
Edit: Danke an Jo King für die Verkleinerung.
quelle
Java 10,
186185 BytesNimmt die minimalen und maximalen Prozentsätze als
/100
Dezimalstellen (dh15%
als0.15
).-1 Byte, um das Problem mit
3.51
der möglichen Ausgabe zu beheben und gleichzeitig Rundungsfehler um 1 Byte zu beheben.Probieren Sie es online aus.
Erläuterung:
quelle
Sauber ,
207156 BytesDas Wechseln zu einer Funktion sparte, nicht überraschend, 51 Byte.
Probieren Sie es online!
quelle
Python (
264222 Bytes)Etwas mehr Golf.
Probieren Sie es online!
quelle
Perl 6 ,
93 9289 BytesProbieren Sie es online!
Anonymer Codeblock, der drei Argumente (Preis, Mindestprozentsatz und Höchstprozentsatz) akzeptiert und den Tipp zurückgibt.
quelle
Wolfram Language (Mathematica) , 105 Byte
Dies ergibt alle Lösungen mit minimaler Münzzahl.
Probieren Sie es online!
quelle
Kotlin , 215 Bytes
Probieren Sie es online!
quelle
Jelly ,
3332 BytesEin monadischer Link, der eine Liste akzeptiert,
[cost in cents, [minimum ratio, maximum ratio]]
die einen Trinkgeldbetrag in Cent ergibt.Probieren Sie es online!
Wie?
Die erste Zeile ist ein Hilfslink, der den angegebenen Betrag abzüglich der größten Nennwertnote / Münze ergibt:
Die Anzahl der Anrufe, die erforderlich sind, um Null zu erreichen, wird verwendet, um den Bereich der Trinkgeldbeträge zu sortieren, und dann wird ganz links ausgegeben:
quelle