Vielleicht haben Sie diese in Die Hard: With a Vengeance ... gesehen. Diese Frage basiert auf dem berühmten 3-Liter- und 5-Liter-Krug-Puzzle, aber mit einer etwas anderen Neigung.
Spielen Sie einen Code nach, der Ihnen bei einer Ganzzahl zwischen 1 und 100 die schnellste Anleitung bietet, um die entsprechende Anzahl von Litern Wasser aus einem Springbrunnen mit einem 3-Liter-Krug und einem 5-Liter-Krug in einen Tank zu füllen.
Auf keinem der Krüge sind Abstufungen; Der Brunnen ist reichlich mit Wasser versorgt, und es wird angenommen, dass der Tank zu Beginn jeder Ausführung des Codes geleert wird.
Sie können nicht auf das Wasser aus dem Tank zugreifen, wenn es erst einmal in den Tank gelangt ist.
Das Format der Ausführung ist wie folgt:
Eingang:
4
beispielsweise.
Ausgabe
Geben Sie jeden nummerierten Schritt wie gezeigt aus, gefolgt von einer Auflistung der Volumina der 5-Liter-Kanne, der 3-Liter-Kanne und des Tanks. Tally-Format auch unten gezeigt. Die Anzahl der Schritte muss auch am Ende der Schritte ausgegeben werden.
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into 3L jug
5L: 2, 3L: 3, T: 0
3) Empty 3L jug
5L: 2, 3L: 0, T: 0
4) Pour from 5L jug into 3L jug
5L: 0, 3L: 2, T: 0
5) Fill 5L jug
5L: 5, 3L: 2, T: 0
6) Pour from 5L jug into 3L jug
5L: 4, 3L: 3, T: 0
7) Pour from 5L jug into tank
5L: 0, 3L: 3, T: 4
Volume measured out in 7 turns
Beispiel 2
Eingang: 8
Ausgabe:
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 3L jug
5L: 0, 3L: 3, T: 5
4) Pour from 3L jug into tank
5L: 0, 3L: 0, T: 8
Volume measured out in 4 turns
Konventionen
Fill xL jug
- Füllt den dazugehörigen Krug bis zum Rand vom BrunnenEmpty xL jug
- entleert den Inhalt der zugehörigen Kanne in den BrunnenPour from xL jug into yL jug
- Gießt den Inhalt der xL-Kanne in die yL-KannePour from xL jug into tank
- Gießt den Inhalt der xL-Kanne in den Tank
Kürzester Code gewinnt.
quelle
Antworten:
Rubin,
407376365331324323Dies wird immer schwieriger zu lesen ...
Übernimmt die Eingabe für STDIN. Beispiellauf für N = 10:
quelle
T-SQL 2012:
14101302Ein weiterer quixotischer Versuch, eine Frage in SQL zu beantworten, aber dieser bot eine erfreuliche Gelegenheit, mit einigen der neuen Fensterfunktionsoptionen in Version 2012 zu spielen. Außerdem werden rekursive CTEs ausgenutzt, die in den meisten Programmiersprachen nicht beeindruckend sind, sondern Rekursion in SQL ist wie der Wechsel von Pferd und Buggy zu einem Ferrari.
Die Engine, die das Herzstück bildet, befindet sich in den Zeilen 5-12, in denen mithilfe eines rekursiven CTE und einer Fensterfunktion eine Tabelle mit den meisten zur Lösung des Problems erforderlichen Zahlen erstellt wird. Beachten Sie insbesondere den Test für 3, 4, 6 oder 9, der ab diesen Zahlen eine optimale Annäherung an die Lösung um 3s sicherstellt. (Technisch gesehen ist es ein Unentschieden zwischen dem 3: 1-Ansatz und dem 2: 2-Ansatz, aber auf diese Weise habe ich viele Charaktere golfen.) Dann ist es ganz einfach, eine Nachschlagetabelle mit den optimalen Schritten für verschiedene zu erstellen Teile des Problems und verwende eine andere Fensterfunktion, um die Schritte richtig zu nummerieren.
Wenn Sie nicht über MS SQL verfügen, spielen Sie mit SQLFiddle.
Ergebnisse für die Eingabe 42:
Bearbeiten:
Golfte eine ordentliche Punktzahlverbesserung durch
quelle
Javascript: 481
Erster Golfversuch, Beratung erwünscht
Es bringt einige Zahlen durcheinander, weil es nicht überprüft, ob es besser ist, 3 oder 5 zu gießen. Beispiel: 9 gibt 9 Runden statt 6, ich kann es später korrigieren
Füge es in die Konsole ein
Von 553 auf 481 dank @WallyWest
quelle
n=["3L jug","5L jug","tank"];l=[0,0,0];t=[3,5,0];h=0;c=console;function e(d){l[d]=t[d];c.log(++h+") Fill "+n[d]);k()}function m(d,g){s=l[d];f=l[g];b=s+f>t[g];l[g]=b?t[g]:f+s;l[d]=b?s-(t[g]-f):0;c.log(++h+") Pour from "+n[d]+" into "+n[g]);k()}function k(){c.log("5L: "+l[1]+", 3L: "+l[0]+", T: "+l[2])}a=prompt();for(t[2]=a;4<a;)e(1),m(1,2),a-=5;2<a&&(e(0),m(0,2),a-=3);1<a&&(e(1),m(1,0),m(1,2),a=0);0<a&&(e(0),m(0,1),e(0),m(0,1),m(0,2));c.log("Volume measured out in "+h+" turns")
für 481 Zeichen ...if
s zu verwendenJava, 610
Ich nahm die Lösung von Sumedh und spielte Golf. Ich wollte es in die Kommentare aufnehmen, aber mein Ruf ist nicht genug :(. Es ist 40% weniger, ich denke, es sollte zumindest geteilt werden. Trotzdem noch weit davon entfernt, zuerst ...
Hier ist ungolfed:
NB: Es funktioniert nur beim ersten Durchlauf. Führen Sie es erneut aus, und das Ergebnis ist falsch (aufgrund einer globalen Variablen).
Die folgende Version ist sicher, aber wir verlieren 2 Zeichen von 610 auf 612:
Beispielausgabe für N = 69:
quelle
Java: 984
Hier ist der Code
Die Eingabe erfolgt über die Befehlszeile. Zum Beispiel: Java X 4
quelle
main(String[]s)
,int n=Integer.parseInt(s[0]),t=0,c=0;
,java.io.PrintStream q=System.out;
. Es kann auch möglich sein, das erstewhile
Zeichen ein oder zwei Zeichen kürzer zu schreibenfor
. Ferner IhreString
s repetitiv sind, können Sie versuchen , sich wiederholende Teile in Variablen oder erstellen Funktionen zu speichern , dass sie nur ein Fertighaus bauen mitString
.Python 2.7 - 437
Nicht der kürzeste Code, aber ich denke, dies ist der optimalste Weg, dies zu lösen.
Wie ich in den Kommentaren ausgeführt habe, ist dies der beste Weg, dies zu berechnen:
divmod(amount,5)
. Dies gibt Ihnen einen von 4,3,2,1 als Rest.Wobei entweder 1 oder 2 übrig bleiben. Verwenden Sie die optimale Lösung für beide, die im Voraus bekannt sein können als:
Der Code:
Und eine Ausgabe für 4L in 7 Schritten:
quelle
Smalltalk (Smalltalk / X),
568 560516Eingabe in n:
Junge, das ist definitiv das verschleierteste Programm, das ich je geschrieben habe ...
Bearbeiten: Einige andere Smalltalks erlauben möglicherweise keine automatisch deklarierten Arbeitsbereichsvariablen und Sie müssen Deklarationen voranstellen. Auch bindWith: kann unterschiedlich sein (expandWith: '<p>').
Beispielausgabe für n = 17:
quelle
C
567609vorherige ungültige Version:
und hier ist der Code entgolfet:
quelle
C (
480465 Bytes)Optimale Version (fügt 10 Bytes hinzu)
Wahrscheinlich wird hier mehr Golf gespielt - die Ausgabefunktionen haben mich umgebracht. Dies sollte die optimale Lösung ergeben (geringste Anzahl von Schritten). Ähnlich wie bei anderen Codes werden hier 5-Liter-Krüge gefüllt und geleert, bis sie unter 5 fallen, und dann auf 3-Liter-Krüge umgeschaltet. Es prüft auf 2 Sonderfälle (6 und 9) und schaltet auf 3-Liter-Kannen um, wenn es diese findet. Die Anweisungen zum Erhalten von 1L und 2L sind fest codiert.
Mehr lesbare Version:
Bearbeitungen:
Testausgabe für n = 11 (optimale Version):
quelle
T-SQL (2012):
794689580Inspiriert von @ Jonathan-Van-Matres T-SQL-Antwort in Kombination mit @ Lego-Stormtrooprs Algorithmus. Ich wollte das machen, weil ich die 99 Flaschen Bier genossen habe Herausforderung so gut gefallen hat.
Ich habe versucht, Fenster zu halten (
OVER
) - Funktionen auf ein Minimum zu beschränken, anstatt die mathematischen / bool-Funktionen zu verwenden.SQLFiddle ist da .
Eingang:
11
Für Menschen lesbar:
quelle
input = 8
input = 11
Python 3 (417 Zeichen)
Erklärt
Beachten Sie, dass wir 4 Objekte haben, nämlich den 3-Liter-Krug, den 5-Liter-Krug, den Tank und den Springbrunnen. Wir können nur Wasser von Objekt
a
zu Objekt bewegenb
. Das ist welche Funktiono(a, b)
in meinem Code tun, es Wasser bewegen und drucken und weiterzählen.Tricks
N=['3L jug','5L jug','tank',0]
. Hier muss ich das letzte Element vermeidenIndexError
. Sie kann auch als globale Zählvariable ohne dasglobal
Schlüsselwort expansive verwendet werden . Beispielsweise,N[3] += 1
Da
0 <= a < 4, 0 <= b < 4
in Funktiono(a, b)
, können wir mit(a, b)
in eine hexadezimale Ziffer kodieren(a << 2) | b
und mit dekodierendivmod(x, 4)
. Mit diesem Trick können alle 5 Lösungen (reminder=0, 1, 2, 3, 4
) in ein Array codiert werden['','c1c12','d46','c2','d434d46']
, das etwas kürzer als die ursprüngliche Form ist:A=[ (), ((3,0),(0,1),(3,0),(0,1),(0,2)), ((3,1),(1,0),(1,2)), ((3,0),(0,2)), ((3,1),(1,0),(0,3),(1,0),(3,1),(1,0),(1,2)) ]
Beispielausgabe (n = 17)
quelle
COBOL (IBM Enterprise COBOL) 192 Zeilen mit 72 Zeichen
Dies ist ein Proof of Concept für die Frage und der Beginn eines für Golf-COBOL :-)
Die Frage fragt nach dem schnellsten. Implementieren Sie also Parallelität. Selbst eine Person kann problemlos einen 3-Liter- und einen 5-Liter-Krug gleichzeitig füllen.
Teilen Sie einfach die Eingabe durch acht und lassen Sie den Rest übrig. Führen Sie einige schnelle 5-Liter- / 3-Liter-Füllungen durch, bis acht genau passen, und kümmern Sie sich dann um die verbleibenden sieben Liter.
Der interessanteste Rest ist für vier Liter. Wenn Sie einen Liter plus drei Liter einfüllen, wird viel weniger Wasser verbraucht, nur 18 Liter gegenüber 23 Litern für die anderen Möglichkeiten.
Der Code (funktioniert)
Dies führt zu einer Unmenge von Diagnosemeldungen für Code, der an der falschen Stelle beginnt, und zu einem Mangel an erforderlichen Punkthaltestellen.
Keine der Diagnosen zeigt eine Auswirkung auf den Objektcode an. Also, obwohl es eine kaputte RC = 8 ist, weiß ich, dass das Objekt in Ordnung ist, also verknüpfe es und starte es.
Hier sind die Ausgänge für ein bis acht Liter. Danach können alle Ergebnisse eingesehen werden. 17 und 100 sind als Beispiele für die Parallelität enthalten.
Es gibt noch viel zu tun, um das Programm in Zeichen zu zerquetschen. Die richtige Ausgabe war das Wichtigste zuerst. Das Zählen der Zeichen in Zeilen mit fester Länge ist eine andere Sache.
Beispielausgabe:
quelle