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.51
i czy3.75
są również prawidłowe dane wyjściowe dla przypadku testowego23.45 15 17
? Używają tej samej ilości monet i są również w zasięgu.Odpowiedzi:
Węgiel , 60 bajtów
Wypróbuj online! Pobiera dane wejściowe jako miejsca dziesiętne. Link jest do pełnej wersji kodu. Wyjaśnienie:
Wprowadź rachunek.
Wprowadź ułamki dziesiętne końcówki i oblicz minimalną i maksymalną końcówkę.
Zacznij od zera.
Ciąg SEXy rozwija się, do
10050.20.10.5.01.0.250.1.05.01
którego jest podzielony na trzyosobowe grupy i rzutowany na pływający.Dodaj tyle aktualnego nominału, ile potrzeba, aby osiągnąć minimalną wskazówkę.
Usuń jeden nominał, jeśli maksymalna końcówka została przekroczona.
Sformatuj wskazówkę do wyświetlenia.
źródło
I
zamiast﹪%.2f
.JavaScript (ES6), 93 bajty
Wypróbuj online!
W jaki sposób?
Rekurencyjnie obliczamy sumę wartości banknotów / monet, aż znajdzie się ona w dopuszczalnym zakresie, zawsze najpierw próbując najwyższej wartości.
źródło
Python 3.x:
266185 bajtówProsta modyfikacja mojego przykładowego programu w pytaniu. Zauważ, że wynik nie jest już sformatowany, aby wymagał 2 miejsc po przecinku.
Edycja: Podziękowania dla Jo King za zmniejszenie.
źródło
Java 10,
186185 bajtówPrzyjmuje minimalne i maksymalne wartości procentowe jako miejsca
/100
dziesiętne (tj.15%
Jako0.15
).-1 bajt, aby rozwiązać problem z
3.51
potencjalnymi danymi wyjściowymi i sposób na poprawienie błędów zaokrąglania o 1 bajt jednocześnie.Wypróbuj online.
Wyjaśnienie:
źródło
Czysty ,
207156 bajtówNic dziwnego, że zamiana na funkcję pozwoliła zaoszczędzić 51 bajtów.
Wypróbuj online!
źródło
Python (
264222 bajtów)Nieco bardziej golfa.
Wypróbuj online!
źródło
Perl 6 ,
93 9289 bajtówWypróbuj online!
Anonimowy blok kodu, który pobiera trzy argumenty (cena, minimalny procent i maksymalny procent) i zwraca wskazówkę.
źródło
Wolfram Language (Mathematica) , 105 bajtów
To da wszystkie rozwiązania przy minimalnej liczbie monet.
Wypróbuj online!
źródło
Kotlin , 215 bajtów
Wypróbuj online!
źródło
Galaretka ,
3332 bajtyMonadyczny link akceptujący listę,
[cost in cents, [minimum ratio, maximum ratio]]
która daje napiwek w centach.Wypróbuj online!
W jaki sposób?
Pierwszy wiersz to link pomocniczy, który daje podaną kwotę pomniejszoną o największą banknot / monetę o nominale:
Liczba połączeń wymagana do osiągnięcia zera jest używana do sortowania zakresu ilości napiwków, a następnie jest uzyskiwana skrajna lewa strona:
źródło