Spielen Sie mir etwas Geld vom Geldautomaten ab

26

Die Aufgabe ist einfach. Holen Sie mir ein paar 1000, 500und 100Notizen.

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, 500und 100Anmerkungen 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 == 0ja, dann spuckt ATM 1 500Note, 5 100Noten und 1000Restnoten
    • Else , wenn A%500 == 0die ATM - 5 spuckt 100Noten, ruhen 1000Notizen
    • Wenn Else A%1000 < 500, die ATM - Spieße floor(A/1000) 1000Notizen und Rest 100Notizen
    • Else , wenn A%1000 > 500die ATM - Spieße floor(A/1000) 1000Notizen, 1 500und Rest 100Notizen
  • Abgehobener Betrag ist größer als gleich 5000
    • Wenn A%1000 == 0ja, dann spuckt der Geldautomat 2 500Noten und 1000Restnoten
    • Else , wenn A%500 == 0, spuckt der ATM 1 500Noten- und Rest 1000Notizen
    • Wenn Else A%1000 < 500, die ATM - Spieße floor(A/1000) 1000Notizen und Rest 100Notizen
    • Else , wenn A%1000 > 500die ATM - Spieße floor(A/1000) 1000Notizen, 1 500und Rest 100Notizen

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, 500und 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.

Optimierer
quelle
@nutki in der Tat. Bearbeitet
Optimierer
Gibt es Geschwindigkeitsbegrenzungen? Sollte der letzte Testfall 21 14 2in angemessener Zeit abgeschlossen sein?
Jakube
1
@ Jakube In einer angemessenen Zeit - ja (sagen wir weniger als 5-6 Stunden). Aber als solches keine Grenze, da dies Code-Golf ist.
Optimierer
Wenn ich also 0 zurückziehe, bekomme ich fünf 100 Scheine?
AJMansfield
@AJMansfield natürlich nicht. Sie können keine 0 Betrag
Optimierer

Antworten:

7

JavaScript, 184 148

function g(a,b,c){x=[];while(a>0||b>0||c>0){i=b<3||a<4?a:4;a-=i;if(i>3&&b>1){b-=2;i++}else{i+=(c--<b&&i>4?0:.1)+(b-->0?.5:0)}x.push(i*1e3)}return x}

http://jsfiddle.net/vuyv4r0p/2/

Gibt eine Liste von ganzen Zahlen zurück, die den Auszahlungsbeträgen entsprechen

hoffmale
quelle
Versuchen Sie es g(5,1,1). Eine bessere Lösung: 5600.
Jimmy23013
sollte jetzt behoben sein
hoffmale
g(5,1,0)Lösung: 5500.
Jimmy23013
das sollte jetzt auch behoben sein ^^ danke für den
hinweis
g(5,2,0)Lösung: 6000.
Jimmy23013
1

Perl 5: 223

Bearbeiten

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).

#!perl -pa
$c{0,0}=$f=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/.(?=.$)/>($n=$c{$i-$`,$j-$'})||${$r=\$c{$i,$j}}<($x=$n+$&)&&$$r
or$f=$$r="$x $n".($'.$&+5*$`)."00
"for 204..206,105,106,11..15,110..114}}$_=$f."100
"x($c-$f+3);s/.*\b3//

Schnellere 259-Lösung.

#!perl -pa
$c{0,0}=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/\B./<($%=$c{$i-$&,$j-$'}+$`)&&(!${$r=\$c{$i,$j}}||$$r>$%)and$d{$i,$j}=$_,$$r=$%for
qw/024 025 026 015 016/,101..105,110..114}}
$d{$b,$a}=~/\B./,$c-=$`,$b-=$&,$a-=$',print$'.$`+5*$&,"00
"while$a+$b;$_="100
"x$c

Verwendet STDIN:

$perl atm.pl <<<"21 14 2"
5000
5000
5000
5000
5000
600
600
600
1600
nutki
quelle
Versuchen Sie es 10 0 0. Bessere Lösung: 10100.
Jimmy23013
@ user23013 oops, ich habe die Frage falsch verstanden. Ich nahm an, 7k ist die maximale Menge :( Ich hoffe, ich werde in der Lage sein, es zu beheben.
Nutki