Większość aplikacji kalkulacyjnych ze wskazówkami po prostu bierze stały procent ceny posiłku. Na przykład, jeśli Twój posiłek kosztuje 23,45 USD, możesz zostawić napiwek 15% = 3,52 USD lub bardziej hojny napiwek 20% = 4,69 USD.
Wystarczająco wygodne dla użytkowników kart kredytowych. Ale nie tak, jeśli wolisz zostawić napiwki, w takim przypadku te nieparzyste centy przeszkadzają. Zmodyfikujmy więc ten pomysł, aby był wygodniejszy dla użytkowników gotówki.
Twoj przydział
Napisz, możliwie jak najmniej bajtów, program lub funkcję, która przyjmuje dane wejściowe:
- Cena posiłku
- Minimalny procent napiwków
- Maksymalny procent napiwków
I wypisz dowolną ilość napiwków w zakresie [cena * min_percentage / 100, cena * max_percentage / 100], która minimalizuje liczbę wymaganych rachunków / banknotów i monet.
Załóżmy, że nominały pieniężne w USA to 1 ¢, 5 ¢, 10 ¢, 25 ¢, 1 USD, 5 USD, 10 USD, 20 USD, 50 USD i 100 USD.
Przykład
Oto przykładowy program do gry w golfa w Pythonie:
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)))
Niektóre przykładowe dane wejściowe i wyjściowe:
~$ 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)Czy ma to na celu zastąpienie naszych wartości domyślnych dla wejść i wyjść? To znaczy, czy np. Funkcja, która przyjmuje trzy liczby i zwraca wynik, jest dozwolona?
3.51i czy 3.75są również prawidłowe dane wyjściowe dla przypadku testowego 23.45 15 17? Używają tej samej ilości monet i są również w zasięgu.