cinpush
main:
gte Hans 1s Leopold
jnz Leopold done
mov 1s Hans
gte Gertrude Hans Leopold
jnz Leopold done
mov Gertrude ShabbySam
mov Hans Gertrude
mov ShabbySam Hans
gte Alberto Gertrude Leopold
jnz Leopold done
mov Alberto ShabbySam
mov Gertrude Alberto
mov ShabbySam Gertrude
done:
mov 10 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_u
mov 30 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_d
undo_r:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
jmp end
undo_u:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" l
"shuffle" l
"shuffle" f
"shuffle" b
jmp end
undo_d:
POP!! 1
"shuffle" f
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
end:
jnz 1s main
print Hans
done!
Das hat echt Spaß gemacht, danke Liam! :)
Vielen Dank an Sp3000 für einen kleinen, aber notwendigen Schubs in die richtige Richtung.
Wie?
Zwei Wörter: Pocket Cube .
Es stellt sich heraus, dass die Stapel den Flächen eines 2x2x2 Rubik's Würfels wie folgt entsprechen:
____ ____
| | |
| 19 | 17 |
|____U____|
| | |
| 20 | 18 |
_________|____|____|____ ____ ____ ____
| | | | | | | | |
| 13 | 14 | 1 | 2 | 9 | 10 | 6 | 5 |
|____L____|____F____|____R____|____B____|
| | | | | | | | |
| 15 | 16 | 3 | 4 | 11 | 12 | 8 | 7 |
|____|____|____|____|____|____|____|____|
| | |
| 22 | 24 |
|____D____|
| | |
| 21 | 23 |
|____|____|
Wobei ULFRBD
anzugeben ist, welches Gesicht oben, links, vorne, rechts, hinten und unten entspricht, wenn der Würfel richtig gefaltet ist.
Die Permutationen entsprechen einer Drehung einer Seite um 90 Grad (wobei die Namen zum Glück übereinstimmen). Es stellt sich heraus , dass f
, r
und d
sind im Uhrzeigersinn Drehungen (wenn das Gesicht angezeigt werden sollen ) , und r
, l
und u
sind gegen den Uhrzeigersinn Drehungen (wenn das Gesicht angezeigt werden sollen ).
Nun ist die cinpush
betreibt Befehl , so dass er eine der Rotationen gilt u
, d
oder r
(je nach dem gegebenen Wert) , und drückt dann den Eingabewert auf den Stapel in Position 1
. (Und dann wird dies für jedes Element in der Eingabe wiederholt.) Dies bedeutet, dass wir diesen Prozess umkehren können (um sicherzustellen, dass wir die richtige Stapelreihenfolge erhalten, ohne einen beliebigen Rubik-Würfel lösen zu müssen), indem wir wiederholt auf den Stapel in schauen positionieren 1
, die entsprechende Permutation rückgängig machen und den Wert dieses Stapels platzen lassen (damit wir beim nächsten Mal den Wert darunter sehen).
Wie machen wir die Rotationen rückgängig? Zum Glück haben wir beide f
und b
zu unserer Verfügung. Wenn wir beide anwenden, drehen wir den gesamten Würfel um 90 Grad. Das bedeutet , dass wir die betroffene Seite (bewegen U
, R
oder D
) zu L
, löse , die Drehung mit einem oder drei l
s (abhängig von der relativen Richtung l
und die Drehung durchgeführt während der Eingabe), und dann drehen , um seine vorherigen Ausrichtung den Würfel zurück Verwendung f
und b
nochmal.
Insbesondere kann jede während der Eingabe ausgeführte Drehung wie folgt rückgängig gemacht werden:
u --> fffbbblllfb
r --> ffbblffbb
d --> fblfffbbb
Ich werde sehen, ob ich mit einigen Animationen zeigen kann, dass dies funktioniert.
Auf diese Weise können wir die gesamte Eingabe einmal durchlaufen. Aber mit 5 Registern ist das alles, was wir brauchen:
Alberto
ist der maximale Wert, der bisher angetroffen wurde.
Gertrude
ist der zweitgrößte Wert, der bisher angetroffen wurde.
Hans
ist der drittgrößte Wert, der bisher festgestellt wurde.
Wenn wir auf einen neuen Wert stoßen, sprudeln wir diese drei Werte so weit wie nötig in die Luft, um sie ShabbySam
als temporäres Register für die Swaps zu verwenden. Das lässt noch etwas zu, Leopold
das wir bei den notwendigen Vergleichen als Bedingung heranziehen können.
Am Ende des Prozesses drucken wir einfach den Inhalt von aus Hans
, der bereits den drittgrößten Wert enthält.
TKDYNS von Sam Cappleman-Lynes
Das ist wahrscheinlich nicht optimal, aber ich denke, es macht den Trick ...
Das mag überraschen, aber ich habe es nicht von Hand geschrieben ... Der Code wurde mit dem folgenden Mathematica-Programm generiert:
Ich habe eigentlich alle diese
safetyCheck
Zeilen von Hand geschrieben. Die erste Zeile dieses Mathematica-Codes ist jedoch ungefähr 28.000 Zeichen lang und wurde selbst mit folgendem CJam-Code generiert:(Wodurch die 10 im Interpreter fest codierten Layouts als Eingabe verwendet werden. Sie können den Code online ausführen. )
Code-Generierungs-Konzept!
Erläuterung
Schauen Sie sich zunächst dieses CJam-Skript an, um zu sehen, wie die Labyrinthe aussehen.
Meine Lösung basiert auf einer wichtigen Beobachtung: Solange wir Elemente entlang einer einzelnen Spalte aufnehmen, werden wir nicht zwischen Layouts wechseln, unabhängig davon, ob die Zellen gefüllt sind oder nicht. Insbesondere bleiben wir im Layout, solange wir uns in der äußersten linken Spalte bewegen
0
. Solange wir uns in der nächsten Spalte bewegen, bleiben wir im Layout1
.Das Knifflige ist, wie wir sicherstellen können, dass wir zwischen Layouts gewechselt haben , da wir nicht wissen, welche Zellen in der Spalte
1
Elemente enthalten (falls vorhanden!).Hier ist der Algorithmus (beginnend mit der Zelle
0
im Layout0
):Versuchen Sie nun für jede Zelle rechts von der aktuellen Spalte (versuchen Sie es in der Reihenfolge der Spalten, in der sie sich befinden), sich im aktuellen Layout dorthin zu bewegen, heben Sie dort ein Element auf und bewegen Sie sich dann mit dem neuen Layout in die oberste Zeile der neuen Spalte.
Wenn die versuchte Zelle ein Element enthielt, hat sich das Layout geändert und wir erreichen erfolgreich die neue Spalte und das neue Layout. Da sich die neue (sichere) Position in der obersten Zeile befindet, aber alle Versuche, die nächste Spalte zu finden, 10 Netto-Aufwärtsbewegungen umfassen, schlagen alle anderen Versuche fehl, sodass wir sie ignorieren können.
Wenn die versuchte Zelle keinen Gegenstand enthielt, stirbt der Diener in den meisten Fällen während des Versuchs, die oberste Reihe mit dem falschen Layout zu erreichen, und verwirft diesen Versuch. Dies ist jedoch nicht immer der Fall. Beispielsweise befindet sich die versuchte Zelle möglicherweise bereits in der obersten Zeile, sodass im neuen Layout keine Änderungen vorgenommen wurden. In einigen Fällen ist der Pfad von der versuchten Zelle zur obersten Zeile kurz genug, um in beiden Layouts gültig zu sein. Ich habe alle Fälle gesammelt, in denen es sich um ein manuelles Problem handelt, und eine Reihe von Zügen ermittelt, die nur für das neue Layout gültig sind (bei denen der Diener jedoch zurück in die Zielzelle verschoben wird, sodass es sich im Grunde genommen um ein No-Op handelt neues Layout). Nach jedem Versuch, bei dem dies ein Problem sein kann, führe ich diese Schritte aus, um alle Schergen zu töten, die dies nicht getan haben.
Wir sind jetzt erfolgreich an den Anfang der nächsten Spalte gewechselt, die mindestens ein Element enthält. Gehen Sie zurück zu Schritt 1.
Möglicherweise stellen Sie fest, dass die Struktur der Lösung wie folgt lautet:
Was den Mathematica-Code betrifft, sind die
safetyCheck
Zeichenfolgen diejenigen handverlesenen Züge, die sicherstellen, dass wir das neue Layout erreicht haben. Der erste Parameter für die Suche ist das Layout, mit dem wir beginnen, und der zweite ist die Zelle, die wir versucht haben. Alle Kombinationen, die nicht ausdrücklich erwähnt werden, geben nur eine leere Sicherheitsprüfung (da keine erforderlich ist).Darüber hinaus
Graph
richte ich einfach die 10 Labyrinthe als Objekte ein, bei denen sich zwischen benachbarten (und verbundenen) Zellen zwei gerichtete Kanten befinden, wobei jede Kante mit einer Bewegung versehen ist, die zum Überqueren der Kante erforderlich ist. Damit kann ich einfach die Pfade mit findenFindShortestPath
und dann die entsprechenden Kantenbeschriftungen mit extrahierenPropertyValue[..., EdgeLabels]
.Der Rest des Codes macht nur Gebrauch davon, um den obigen Algorithmus ziemlich direkt zu implementieren.
Die eigentlichen
layouts
Grafikdaten werden im CJam-Skript gespeichert und generiert, das die Zahlen wie im Cop-Post beschrieben decodiert und in eine Mathematica-Liste umwandelt, die sich leicht in eine Grafik umwandeln lässt.quelle
HPR von Zgarb
Der Code:
Zuallererst ... wurde der Code generiert, nicht von Hand geschrieben (oder getippt).
Fakten zur Sprache:
Das Programm verwendet den folgenden Pseudocode:
Die Umgebung enthält fast immer nur 1 Liste und 1 Ganzzahl.
Um dies zu lösen, habe ich eine kleine Makro-Engine für diese Sprache erstellt. Es erlaubt auch Kommentare. Hier ist die Makro-Engine:
Nachdem ich die Makro-Engine erstellt hatte, baute ich langsam nützliche Funktionen für diese Sprache auf. Hier ist der Code, den die Engine zum Erstellen des Programms verarbeitet hat:
quelle
Brian & Chuck von Martin Büttner
Das folgende Python 2.7-Programm gibt mein Brian & Chuck-Programm aus, indem es ein Brainfuck-Programm in Brian & Chuck übersetzt (mit der Ausnahme, dass
.
immer gedruckt wird1
, da dies das einzige Zeichen ist, das wir ausgeben müssen).Der Kontrollfluss funktioniert wie von
Zauberhand,indem Brian auf Chucks Bandbefehle schreibt, um Brian an die richtige Stelle im Code zu schicken.Beachten Sie, dass Leerzeichen und
[]
s, die dem B & C-Programm hinzugefügt wurden, nur zur Dekoration dienen.quelle
Firetype, von kirbyfan64sos
Funktionierender, kommentierter Code:
Dies beruht auf dem Dolmetscher, wie er derzeit in der Antwort des Polizisten angegeben ist, was der Dokumentation zu
%
und leicht widerspricht!
.Die größte Herausforderung bestand darin, die Eingabe zu analysieren, da das
\
Auffinden des drittgrößten Werts relativ einfach ist.quelle
Acc !, von DLosc
Diese Sprache hat schreckliche Vergleichsunterstützung.
In den
count [varname] while 0
Anweisungen am Anfang wird die Variable deklariert, die die größte Zahl, die zweitgrößte Zahl, die drittgrößte Zahl usw. enthält. Die Vergleiche werden durchgeführt, indem die beiden Zahlen subtrahiert werden und dann geprüft wird, ob das Ergebnis negativ ist, indem geprüft wird, ob es eine Zahl ist, die kleiner als diese Zahl ist10^6
.quelle
Zink, von kirbyfan64sos
Das war nicht so schwer, als ich verstanden hatte, wie die Sprache funktioniert. Der schwierige Teil bestand darin, Parser-Fehler zu beseitigen, aber das Hinzufügen einiger überflüssiger Klammern schien das zu beheben. Hier ist die Lösung:
Erläuterung
In der ersten und zweiten Zeile definiere
+
ich diecut
Operation. Der Rest ist gesetztes Verständnis. Nehmen wir die Eingabe101011101100
als Beispiel und beginnen Sie mit der innersten:Dies nimmt die Elemente
a
aus der Eingabemenge,S = {1,0,1,0,1,1,1,0,1,1,0,0}
deren Index nicht istlen(S)-1
, also alle bis auf den letzten. Mir ist aufgefallen, dass dies auch die Menge umkehrt, so dass das Ergebnis istA = {0,1,1,0,1,1,1,0,1,0,1}
. Als nächstes das VerständnisNimmt alle Elemente
A
außer dem ersten und kehrt es wieder um, was zur Folge hatB = {1,0,1,0,1,1,1,0,1,1}
. Dann teilen wir unsB
am0
s auf (dies führt zu{1,1,{1,1,1},{1,1}}
oder dessen Umkehrung, ich habe nicht überprüft, welches) und sortieren das Ergebnis nach Länge. Singleton-Sets sind abgeflacht, aber sie sind alle1
s, sodass ihre Länge immer noch 1 beträgt. Hier ist der Code:Das Ergebnis davon ist
C = {{1,1,1},{1,1},1,1}
. Schließlich filtern wir alles mit Ausnahme des Elements bei Index 2 durchDies ergibt die Menge
D = {1}
in unserem Fall. Im Allgemeinen kann es das Formular haben{{1,1,..,1}}
, aber das spielt keine Rolle, da nur die1
s gedruckt werden.quelle
Kompasssuppe, von BMac
Das hat Spaß gemacht.
Bearbeiten: Diesem Programm muss eine neue Zeile vorangestellt werden, um mit dem BMac-Interpreter arbeiten zu können. Ich kann nicht scheinen, die neue Zeile zu erhalten, um im Codeblock zu erscheinen.
Das Programm ist in 4 Ausführungsbereiche unterteilt.
Die erste, die in Zeile 1, Hängt eine
#
an das Ende des Eingangs durch Auffinden00
und Ersetzen der 2.0
mit#
. Es ändert sich auch alles1
inA
s, da ich so wenig1
s wie möglich im Quellcode haben wollte .Der zweite Abschnitt in Zeile 5 ruft die zweite Zahl in der Eingabe ab und setzt sie als Zeichenfolge von
+
s unter die erste Zahl . Wenn die Eingabe beispielsweise "" lautet11011101100
, führt dies zu folgenden Ergebnissen:Der dritte Abschnitt in Zeile 12 kombiniert die Zeichenfolge von
+
s mit der ersten Zahl: Jede0
über a+
wirdA
,A
wirdB
,B
wirdC
undC
bleibt unverändert. Danach kehren wir zum zweiten Abschnitt zurück, um die nächste Nummer zu holen.Sobald alle Zahlen auf diese Weise kombiniert wurden, erreichen wir den letzten Abschnitt in Zeile 18. Die Anzahl
C
s ist unsere gewünschte Ausgabe, daher ändern wir diese in1
s und überspringen die erste,C
da1
im Quellcode eine einzige mitgedruckt ist mit der Ausgabe.quelle