Zadanie jest proste. Daj mi trochę 1000
, 500
i 100
notatki.
W jaki sposób ? możesz zapytać. Nie martw się, nie musisz okradać banku, ponieważ w pobliżu znajduje się bankomat, który akceptuje Twoją kartę kredytową. Ale twój limit kredytowy wystarczy do wykonania zadania, więc musisz uważać na wypłaty.
Wyzwanie
Biorąc pod uwagę liczbę 1000
, 500
a 100
wymagane notatki, obliczenia wypłat konkretne potrzebne, aby uzyskać przynajmniej te kilka nut. Przy każdej wypłacie bankomat może wypluć każdą notatkę na podstawie następujących zasad:
- Kwota wycofana (
A
) jest mniejsza niż5000
- Jeśli
A%1000 == 0
, po czym wypluwa 1 ATM500
uwaga, 5100
notatki i odpoczynku1000
notatki - W przeciwnym razie
A%500 == 0
bankomat wypluwa 5100
banknotów,1000
banknoty pozostałych - W przeciwnym razie
A%1000 < 500
bankomat wypluwafloor(A/1000)
1000
notatki i100
notatki odpoczynku - W przeciwnym razie
A%1000 > 500
bankomat wypluwafloor(A/1000)
1000
banknoty, 1500
i100
banknoty spoczynkowe
- Jeśli
- Kwota wypłacona jest większa niż równa
5000
- Jeśli
A%1000 == 0
, to bankomat wypluwa 2500
banknoty i1000
banknoty pozostałe - Else if,
A%500 == 0
, bankomat wypluwa 1500
notatkę i odpoczynku1000
notatki - W przeciwnym razie
A%1000 < 500
bankomat wypluwafloor(A/1000)
1000
notatki i100
notatki odpoczynku - W przeciwnym razie
A%1000 > 500
bankomat wypluwafloor(A/1000)
1000
banknoty, 1500
i100
banknoty spoczynkowe
- Jeśli
Dla wyjaśnienia, oto pełna tabela wycofanych notatek dla wszystkich możliwych kwot do 7000
(możesz wypłacić więcej, ale wzór nie zmienia się później). Kolejność jest następująca <1000> <500> <100>
:
100 => 0 0 1 2500 => 2 0 5 4800 => 4 1 3
200 => 0 0 2 2600 => 2 1 1 4900 => 4 1 4
300 => 0 0 3 2700 => 2 1 2 5000 => 4 2 0
400 => 0 0 4 2800 => 2 1 3 5100 => 5 0 1
500 => 0 0 5 2900 => 2 1 4 5200 => 5 0 2
600 => 0 1 1 3000 => 2 1 5 5300 => 5 0 3
700 => 0 1 2 3100 => 3 0 1 5400 => 5 0 4
800 => 0 1 3 3200 => 3 0 2 5500 => 5 1 0
900 => 0 1 4 3300 => 3 0 3 5600 => 5 1 1
1000 => 0 1 5 3400 => 3 0 4 5700 => 5 1 2
1100 => 1 0 1 3500 => 3 0 5 5800 => 5 1 3
1200 => 1 0 2 3600 => 3 1 1 5900 => 5 1 4
1300 => 1 0 3 3700 => 3 1 2 6000 => 5 2 0
1400 => 1 0 4 3800 => 3 1 3 6100 => 6 0 1
1500 => 1 0 5 3900 => 3 1 4 6200 => 6 0 2
1600 => 1 1 1 4000 => 3 1 5 6300 => 6 0 3
1700 => 1 1 2 4100 => 4 0 1 6400 => 6 0 4
1800 => 1 1 3 4200 => 4 0 2 6500 => 6 1 0
1900 => 1 1 4 4300 => 4 0 3 6600 => 6 1 1
2000 => 1 1 5 4400 => 4 0 4 6700 => 6 1 2
2100 => 2 0 1 4500 => 4 0 5 6800 => 6 1 3
2200 => 2 0 2 4600 => 4 1 1 6900 => 6 1 4
2300 => 2 0 3 4700 => 4 1 2 7000 => 6 2 0
2400 => 2 0 4
Lista dostarczona przez Martina
The Catch
Ponieważ limit kredytowy na karcie kredytowej jest wystarczający, musisz upewnić się, że całkowita kwota wypłacona w ramach wypłat jest minimalnym możliwym dla danego wkładu / wymogu dotyczącego banknotów.
Wkład
Dane wejściowe mogą być w dowolnym korzystnym formacie dla trzech liczb odpowiadających liczbie wymaganych nut wartości 1000
, 500
oraz 100
. Niekoniecznie w tej kolejności.
Wydajność
Produkcja globalna to kwota do wycofania w każdej transakcji oddzielona nową linią.
Przykłady
Dane wejściowe (format <1000> <500> <100>
):
3 4 1
Wydajność:
600
600
600
3600
trochę więcej:
7 2 5
5000
3500
1 2 3
600
1700
21 14 2
600
600
600
1600
5000
5000
5000
5000
5000
Założenia
- Możesz założyć, że bankomat ma nieskończoną liczbę banknotów każdej kwoty.
- Możesz również założyć, że możesz dokonywać dowolnej liczby transakcji.
- Co więcej, rozwiązanie niektórych wartości wejściowych może nie być unikalne, więc możesz wypisać dowolne 1 rozwiązanie, które spełnia minimalną możliwą ilość i wymagane minimum notatek.
Jak zwykle, możesz napisać pełny program czytający dane wejściowe przez STDIN / ARGV i wypisujący dane wyjściowe do STDOUT lub funkcję przyjmującą dane wejściowe za pomocą argumentów i zwracającą albo listę liczb całkowitych odpowiadających kwotom, albo ciąg znaków z kwotami oddzielonymi nowym wierszem.
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.
źródło
21 14 2
zakończyć się w rozsądnym czasie?Odpowiedzi:
JavaScript,
184148http://jsfiddle.net/vuyv4r0p/2/
zwraca listę liczb całkowitych odpowiadających kwotom wypłaty
źródło
g(5,1,1)
. Jeden lepsze rozwiązanie:5600
.g(5,1,0)
Roztwór:5500
.g(5,2,0)
Roztwór:6000
.Perl 5:
223Edytować
To rozwiązanie zostało wykonane przy błędnym założeniu, że 7K to limit bankomatu. To faktycznie uczyniło to zadanie bardziej interesującym, ponieważ wymagało dynamicznego programowania (wzorzec ruchu był dość regularny, ale kodowanie na stałe byłoby prawdopodobnie dłuższe niż obliczanie na żywo tak jak ja). Przy każdej możliwej ilości wzorzec ruchu jest tak regularny, że kodowanie go jest trywialne. Nie wiem, czy rozwiązanie @hoffmale jest teraz poprawne, ale znajdzie się wśród tych linii. Tak więc niestety będzie to kolejne zadanie, w którym najpierw ktoś znajdzie rozwiązanie, a następnie zostanie przeniesiony do gry w golfa, aby wygrać.
Trochę wolniej niż oryginalne rozwiązanie (ale wciąż poniżej sekundy dla parametrów poniżej 100).
Szybsze rozwiązanie 259.
Wykorzystuje STDIN:
źródło
10 0 0
. Lepsze rozwiązanie:10100
.