Setzen Sie die Zeile in den Code, den Sie verrückt machen, und schütteln Sie alles auf

10

Schreiben Sie mit einer Programmiersprache 5 einzeilige Programme, von denen jedes eine andere Zeile des ersten Verses zu Harry Nilssons 1972er Song " Coconut " ausgibt, wenn es einzeln ausgeführt wird:

Bruder eine Kokosnuss gekauft, er kaufte es für einen Cent
Seine Schwester ein anderes hatte sie bezahlt sie für einen Kalk
Sie den Kalk in die Kokosnuss setzen, sie trank sie beide bis
Sie den Kalk in die Kokosnuss setzen, sie trank sie beide bis
sie legte die Limette in die Kokosnuss, sie trank sie beide aus

( vollständige Texte )

Die letzten 3 Zeilen haben den gleichen Text, also könnten auch Ihre letzten 3 Programme sein.

Es gibt 5 faktorielle oder 120 Möglichkeiten, wie diese 5 einzeiligen Programme in einem einzelnen 5-zeiligen Programm pro Zeile angeordnet werden können. Sie müssen Ihre einzeiligen Programme so optimieren, dass das 5-zeilige Programm für möglichst viele dieser 120 Kombinationen den gesamten Vers in der richtigen Reihenfolge ausgibt , genau wie oben angegeben.

Beispiel

Die einfachste Antwort hätte 5 einzeilige Druckanweisungen, die letzten 3 sind identisch:

print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')

Die Ausgabe an die 5-Zeilen-Programme erfolgt in der richtigen Reihenfolge, solange sich die ersten beiden Einzeiler an der richtigen Stelle befinden. Nur 6 der 120 möglichen Anordnungen erreichen dies.

Wertung

Die Einreichung mit den meisten Arbeitsfällen von allen 120 gewinnt. Tie - Break an den Satz von Programmen mit dem niedrigsten kumulativen geht Byteanzahl (Zeilenumbrüche nicht gezählt). Das Beispiel hat 309 Bytes.

Einzelheiten

  • Ihre Programme lesen möglicherweise keinen eigenen Quellcode. Sie sollten auch keine anderen externen Dateien lesen oder eine Netzwerkverbindung benötigen.

  • Ausgabe an Standard oder nächstgelegene Alternative. Sie können auch in eine Datei mit dem Namen Ihrer Wahl ausgeben.

  • "Einzeilige Programme" sind Zeichenfolgen, die alle Zeichen außer Zeilenendezeichen enthalten (Sie müssen sich wahrscheinlich nur um Zeilenumbrüche kümmern).

  • Wenn Sie die Single-Liner zu 5-Liner zusammensetzen, sollten Sie genau 4 Newlines hinzufügen, eine zwischen jedem benachbarten Paar von Single-Liner. Sie können optional einen nachgestellten Zeilenumbruch hinzufügen.

Calvins Hobbys
quelle
"Schreibe 5 Programme, die jeweils eine andere Zeile ausgeben ..." ist das nicht unmöglich?
Feersum
@feersum Die Zeilen sind unterschiedlich. Drei von ihnen haben zufällig den gleichen Text.
Calvins Hobbys
Was ist, wenn ich eine Java-Datei mit 5 Klassen mit jeweils einer mainMethode habe? Was sollte dann ausgeführt werden, wenn das Programm ausgeführt wird?
Feersum
@feersum Nun, was macht dein Compiler? Ich bin nicht sicher, was Java macht, wenn beide mehrere Klassen in derselben Datei haben main.
Calvins Hobbys
2
Ich erinnere mich an diese eine Coca-Cola-Anzeige, in der sie "die Limette in die Cola geben" ...
Joe Z.

Antworten:

9

CJam, 120 gültige Permutationen, 334 299 290 Bytes

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

Ziemlich einfache Logik:

  • Fügen Sie jede Zeile des Songs in jedes der 5 Programme ein
  • Wickeln Sie alles auf dem Stapel in ein Array
  • Sortieren Sie das Array
  • Packen Sie das Array aus, damit das nächste Programm dieselbe Logik verwenden kann
  • In jedem Schritt haben wir die Teiltexte in einem Array. Glücklicherweise ergibt das Sortieren des Arrays die richtige Reihenfolge der Texte.

UPDATE : Es stellt sich heraus, dass Sie den Wrap-Sort-Unwrap-Zyklus nach den 3 ähnlichen und in den Endzeilen des Songs erscheinenden nicht benötigen. Ich kann erklären warum, wenn es nicht so offensichtlich ist :)

Optimierer
quelle
8

Vorspiel , 120 Permutationen, 2045 2035 Bytes

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

Dies hat mich letztendlich überzeugt, dass Prelude und CJam ein Kind brauchen. Ohne Preludes sehr begrenzten Befehlssatz wäre diese Einreichung tatsächlich sehr wettbewerbsfähig, wenn sie CJam nicht einmal schlagen würde.

Die Grundidee ist die folgende

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

In Prelude ist jede Zeile eine eigene "Stimme" mit einem eigenen Stapel, und diese Stimmen werden parallel ausgeführt. Das heißt, im vollständigen Programm erstellt jede Zeile die Zeichenfolge einzeln und druckt sie am Ende aus. Aufgrund der Offsets der print-Anweisungen spielt die Reihenfolge der Zeilen für die Reihenfolge der Ausgabe keine Rolle, da die Ausführung von links nach rechts und nicht von oben nach unten erfolgt.

Warum sind die Zeilen so lang? Prelude speichert nur Zahlen auf seinem Stapel. Darüber hinaus kann immer nur eine einstellige Zahl gleichzeitig gedrückt werden, sodass größere Zahlen aus Addition und Subtraktion konstruiert werden müssen (es gibt weder eine Multiplikation noch eine andere Arithmetik). Der größte Teil des Codes besteht also darin, einfach die richtigen Zeichencodes zu berechnen und zu verschieben. Um dies etwas zu verkürzen, habe ich sie um versetzt 96. Am Ende schleife ich zum Drucken eine Schleife, bis der Stapel leer ist (dh a 0angetroffen wird), addiere 96 zu jeder Zahl und drucke sie aus.

Beachten Sie, dass die Zeichenfolgen umgekehrt verschoben werden, da sie vom letzten zum ersten Zeichen gedruckt werden.

Dies setzt den Python-Interpreter mit voraus NUMERIC_OUTPUT = False(so definiert die Spezifikation E / A).

Ich habe den folgenden CJam-Code verwendet, um die Zeichenfolgenkonstruktion zu generieren:

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

Zum Schluss, nur zum Spaß, warum ich denke, dass dies wirklich kurz wäre, wenn Prelude ein Konzept von Streichern hätte:

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

Jetzt sind die Druckanweisungen !bereits in der richtigen Reihenfolge, sodass ich sie nicht einmal ausgleichen muss. Ich denke, ich werde mich irgendwann damit befassen.

Martin Ender
quelle
7

Ruby, 120 gültige Permutationen, 430 Bytes

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

Funktioniert in beliebiger Reihenfolge oder einzeln. Jede Zeile ändert den globalen Status und legt dann einen Hook fest, der am Ende des Programms ausgeführt werden soll, es sei denn, der Hook wurde bereits gesetzt.

Histokrat
quelle
Die Frage lautet "5 einzeilige Programme". Bedeutet dies nicht, dass sich jede Zeile in einem separaten Programm befinden sollte? Nicht alles in einem?
Bacchusbeale
1
Nur eine Frage der Formatierung. Jede Zeile arbeitet als eigenes Programm.
Histokrat
6

> <> , 120 Permutationen, 703 Bytes

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

Die Einzeiler-Einschränkung war für eine 2D-Sprache ziemlich schwierig, daher musste ich einen Weg finden, um das Beste aus dem .Teleport-Unterricht herauszuholen .

Die Initiale <lässt das Programm nach links fließen, umhüllen und ausführen

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

Dies ist eine Reihe von p(Put-) Anweisungen, mit denen Zeichen platziert werden, bis das Board so aussieht:

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

Das #.!50Programm kippt dann den Programmfluss wieder nach rechts, bevor es zu Zeile 5 springt. Folgendes folgt:

  • Wenn Sie dem /Spiegel in Zeile 5 folgen, finden Sie den Text 5, der auf den Stapel geschoben wird. Wir teleportieren uns dann zu Linie 6.
  • Wenn Sie dem /Spiegel in Zeile 6 folgen, finden Sie den Text 4, der auf den Stapel geschoben wird. Wir teleportieren uns dann zu Linie 7.
  • Wenn Sie dem /Spiegel in Zeile 7 folgen, finden Sie den Text 3 ...

Dies geschieht, bis wir den Text 1 drücken. Dann teleportieren wir uns zu Zeile 10. Dies ist eine Schleife, um den gesamten Stapel zu drucken, bis er leer ist.

Wenn nur eine Zeile des Programms vorhanden ist, \erledigen die Spiegel die gleiche Aufgabe wie die Teleports auf jeder Textzeile.

Wenn das Programm verschlüsselt ist, gilt die obige Erklärung weiterhin, sodass das Programm für alle Permutationen funktioniert!

Sp3000
quelle