Die Aufgabe ist einfach. Holen Sie mir ein paar 1000
, 500
und 100
Notizen.
Wie ? Sie könnten fragen. Keine Sorge, Sie müssen keine Bank ausrauben, da sich in der Nähe ein Geldautomat befindet, der Ihre Kreditkarte akzeptiert. Aber Ihr Kreditlimit ist gerade genug für die Aufgabe, so dass Sie mit den Abhebungen vorsichtig sein müssen.
Herausforderung
Angesichts der Zahl von 1000
, 500
und 100
Anmerkungen erforderlich, berechnen die spezifischen Entnahmen zumindest die viele Noten bekommen benötigt. Bei jeder Auszahlung kann der Geldautomat jeden Geldschein nach den folgenden Regeln ausspucken:
- Auszahlungsbetrag (
A
) ist kleiner als5000
- Wenn
A%1000 == 0
ja, dann spuckt ATM 1500
Note, 5100
Noten und1000
Restnoten - Else , wenn
A%500 == 0
die ATM - 5 spuckt100
Noten, ruhen1000
Notizen - Wenn Else
A%1000 < 500
, die ATM - Spießefloor(A/1000)
1000
Notizen und Rest100
Notizen - Else , wenn
A%1000 > 500
die ATM - Spießefloor(A/1000)
1000
Notizen, 1500
und Rest100
Notizen
- Wenn
- Abgehobener Betrag ist größer als gleich
5000
- Wenn
A%1000 == 0
ja, dann spuckt der Geldautomat 2500
Noten und1000
Restnoten - Else , wenn
A%500 == 0
, spuckt der ATM 1500
Noten- und Rest1000
Notizen - Wenn Else
A%1000 < 500
, die ATM - Spießefloor(A/1000)
1000
Notizen und Rest100
Notizen - Else , wenn
A%1000 > 500
die ATM - Spießefloor(A/1000)
1000
Notizen, 1500
und Rest100
Notizen
- Wenn
Zur Verdeutlichung finden Sie hier eine vollständige Tabelle mit den zurückgezogenen Banknoten für alle möglichen Beträge bis zu 7000
(Sie können mehr zurückziehen, das Muster ändert sich jedoch danach nicht mehr). Die Reihenfolge ist <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
Liste zur Verfügung gestellt von Martin
Der Fang
Da das Kreditlimit Ihrer Kreditkarte gerade ausreicht, müssen Sie sicherstellen, dass der Gesamtbetrag, der über die Abhebungen abgehoben wird, das für die jeweilige Eingabe / Anforderung von Banknoten mögliche Minimum ist .
Eingang
Die Eingabe kann für drei Zahlen in jedem günstigen Format sein , entsprechend der Anzahl der Wertscheine erforderlich 1000
, 500
und 100
. Nicht unbedingt in dieser Reihenfolge.
Ausgabe
Die Ausgabe ist der Betrag, der in jeder Transaktion abgezogen werden muss, getrennt durch eine neue Zeile.
Beispiele
Eingabe (Format <1000> <500> <100>
):
3 4 1
Ausgabe:
600
600
600
3600
ein paar mehr:
7 2 5
5000
3500
1 2 3
600
1700
21 14 2
600
600
600
1600
5000
5000
5000
5000
5000
Annahmen
- Sie können davon ausgehen, dass der Geldautomat über unendlich viele Banknoten pro Betrag verfügt.
- Sie können auch davon ausgehen, dass Sie eine beliebige Anzahl von Transaktionen durchführen können.
- Darüber hinaus ist die Lösung für einige Eingabewerte möglicherweise nicht eindeutig, sodass Sie eine beliebige 1 der Lösung ausgeben können, die die Bedingungen für den Mindestbetrag und die Mindestanforderungen für Notizen erfüllt.
Wie üblich können Sie eine vollständige Programmleseeingabe über STDIN / ARGV schreiben und die Ausgabe an STDOUT ausgeben oder eine Funktion, die Eingaben über Argumente vornimmt und entweder eine Liste von Ganzzahlen zurückgibt, die den Beträgen entsprechen, oder eine Zeichenfolge mit Beträgen, die durch eine neue Zeile getrennt sind.
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
quelle
21 14 2
in angemessener Zeit abgeschlossen sein?Antworten:
JavaScript,
184148http://jsfiddle.net/vuyv4r0p/2/
Gibt eine Liste von ganzen Zahlen zurück, die den Auszahlungsbeträgen entsprechen
quelle
g(5,1,1)
. Eine bessere Lösung:5600
.g(5,1,0)
Lösung:5500
.g(5,2,0)
Lösung:6000
.Perl 5:
223Bearbeiten
Diese Lösung wurde mit der falschen Annahme durchgeführt, dass 7K das ATM-Limit ist. Dies machte die Aufgabe tatsächlich interessanter, da sie eine dynamische Programmierung erforderte (das Bewegungsmuster war recht regelmäßig, aber das Hardcodieren würde wahrscheinlich länger dauern als das Berechnen in Echtzeit, wie ich es tat). Bei jedem möglichen Betrag ist das Bewegungsmuster so regelmäßig, dass es trivial ist, es hart zu codieren. Ich weiß nicht, ob die Lösung von @hoffmale jetzt korrekt ist, aber es wird in diesen Zeilen sein. Leider wird es eine andere Aufgabe sein, bei der zuerst jemand eine Lösung findet und dann in eine Golfsprache portiert wird, um zu gewinnen.
Etwas langsamer als die ursprüngliche Lösung (bei Parametern unter 100 jedoch immer noch unter der Sekunde).
Schnellere 259-Lösung.
Verwendet STDIN:
quelle
10 0 0
. Bessere Lösung:10100
.