Eine Form ist chiral, wenn keine Drehung sie spiegelbildlich erscheinen lässt. In diesem Puzzle werden wir chirale Computerprogramme schreiben.
Für dieses Puzzle stellen wir uns ein Programm als rechteckige Zeichenmatrix vor. Als solche müssen alle Lösungen für diese Herausforderung rechteckig sein (dh alle Linien müssen die gleiche Länge haben). Wir können diese Programme in Vierteldrehungsschritten drehen. Zum Beispiel das Programm
The quickish fish
lept deftly
rightwards
Eine Vierteldrehung im Uhrzeigersinn sieht so aus
T
h
r e
i
glq
heu
tpi
wtc
a k
rdi
des
sfh
t
lf
yi
s
h
Wir können diese Programme auch reflektieren. Hier ist dasselbe Programm, das sich über eine vertikale Achse spiegelt:
hsif hsikciuq ehT
yltfed tpel
sdrawthgir
Ein chirales Programm ist ein Programm, das bei beliebiger Drehung immer " left
" ausgibt . Bei " right
" Reflexion wird jedoch ein Programm erstellt, das unabhängig davon, wie oft es gedreht wird , " " ausgegeben wird.
Ihre Aufgabe ist es, ein chirales Programm in möglichst wenigen Bytes zu schreiben.
Zusätzliche Regeln
Die Ausgabe unterscheidet nicht zwischen Groß- und Kleinschreibung, sollte jedoch konsistent sein. (zB Sie können "
LEFT
" und "rIgHt
" ausgeben, aber dieses Gehäuse muss unter Rotationen konsistent sein)Zeilen sind entweder auf eine neue Zeile oder eine neue Zeile und einen Zeilenvorschub aufzuteilen.
Ihr Programm muss ein Rechteck sein. Sie können es mit Leerzeichen oder Kommentaren auffüllen, aber jede Zeile muss dieselbe Länge haben.
Optional können Sie für alle Ihre Programme einen nachgestellten Zeilenumbruch (oder Zeilenumbruch und Zeilenvorschub) festlegen.
quelle
:set virtualedit=all
Modus von Vim verwendet . Die anfänglicheBool
Ausgabe prüft, ob die Eingabe der eigenen Drehung entspricht, was die Sache vereinfacht. Durch Entfernen von{-
wird die reflektierte Eingabe gedruckt.Antworten:
Pascal (FPC) ,
2161755349 BytesVersuchen Sie es links
Versuchen Sie es richtig
@tsh hat mich motiviert, es noch einmal zu versuchen, als ich sein Programm sah (im Kommentar) und hier ist es!
Vorherige mit 755 Bytes:
Versuchen Sie es links
Versuchen Sie es richtig
Wenn Sie meinen vorherigen Beitrag gesehen haben, vergessen Sie ihn einfach :)
Alle Drehungen für das linke und das rechte Programm sind gleich.
quelle
Klein (000) ,
10987 BytesProbieren Sie es online!
Sollte es möglich sein, eine kürzere Version dieser Antwort zu bekommen, so viel Glück!
Diese Antwort ist von Spiralen inspiriert. Insbesondere geht es um zwei ineinandergreifende Spiralen, eine für links und eine für rechts. Es hat eine zweifache Symmetrie. Wir können also die folgenden Programme überprüfen, um zu wissen, ob es funktioniert:
Vierteldrehung
Probieren Sie es online!
Gespiegelt
Probieren Sie es online!
Gespiegelt und Vierteldrehung
Probieren Sie es online!
quelle
Klein (000) ,
2725 BytesProbieren Sie es online! Einmal gedreht! Zweimal gedreht! Dreimal gedreht!
Und umgedreht: Online ausprobieren! Einmal gedreht! Zweimal gedreht! Dreimal gedreht!
Das Einzige, was mir ein bisschen Ärger bereitete, war das einmalige Umdrehen und Drehen. Das sieht so aus:
Dies ist der einzige Grund für die beiden Sätze von
((
.quelle
Klein (211) , 37 Bytes
Dies hat ein anderes Programm für jede Umdrehung.
Erläuterung
Beachten Sie, dass jedes dieser Programme vor der Ausführung mit No-Ops zu einem Quadrat aufgefüllt wird
Keine Änderung
Probieren Sie es online!
!
macht Ausführung Sprung über die\
und"left"@
die Zeichenfolge Lasten"left"
in den Stapel und beendet das Programm Drucken des StapelsVierteldrehung
Probieren Sie es online!
Die Ausführung läuft an der oberen rechten Ecke des Quadrats ab, wird in der unteren linken Ecke fortgesetzt und erneut
!\"left"@
gedruckt"left
.Halbe Drehung
Probieren Sie es online!
Hier verlässt der Hinrichtungsweg die Nordseite, tritt wieder durch die Westseite ein, verlässt wieder den Osten, bevor er in den Süden eintritt.
\
hüpft der Pfad hinein"left"@
, um ihn zu drucken.Dreiviertelumdrehung
Probieren Sie es online aus
Die Ausführung wird in der oberen rechten Ecke beendet und tritt dann in der unteren linken Ecke wieder ein. Wieder
/\
leiten die Spiegel den Pfad"left"@
zum Drucken um.Reflexion
Dies ist im Wesentlichen dasselbe wie für links in allen Umdrehungen.
quelle
JavaScript (Node.js) ,
1481599505461341305271 ByteGespiegelt
Probieren Sie es online!
(Informationen zu allen Testfällen, einschließlich der gespiegelten Version, finden Sie unter TIO Link.)
Obwohl weiter golfen, Größe
22x22 -> 21x21
auf Kredit von @JoKing!Größe
38x38 24x2422x2221x2118x1817x1716x16, 4-fache Symmetrie.Hier kommt eine Frage - ist es möglich, 15x15 oder kleiner für JS zu haben? Es scheint, dass ich mindestens das Kommentar-Trennzeichen zwischen zwei Unterblöcken und am Rand brauche, also mindestens 7 + 2 + 2 + 5 = 16 Zeilen?
quelle
Canvas ,
1098971 BytesVersuchen Sie es hier | Versuchen Sie es umgekehrt! Dies sind die einzigen zwei möglichen Programme, da das Programm rotationssymmetrisch ist.
Gemacht in diesem .
quelle
Gol> <> , 23 Bytes
Probieren Sie es online!
Dies ist das gleiche Format wie meine Klein-Antwort , aber 2 Bytes kürzer. Vielleicht gibt es da draußen eine andere 2D-Sprache, die die letzten 2 Bytes Golf spielen kann ... Aber im Moment ist dies so kurz wie es nur geht.
quelle
Alice , 25 Bytes
Links: Normal , 1/4 Umdrehung im Uhrzeigersinn , 1/2 Umdrehung , 1/4 Umdrehung gegen den Uhrzeigersinn
Rechts: Spiegeln über die horizontale Achse , die Diagonale nach unten rechts , die vertikale Achse , die Diagonale nach oben rechts
Erläuterung
Dieses Programm besteht aus drei Teilen. Der erste Teil sind die drei
{
s und eins}
an den Ecken. Die{
wiederum die IP - links , bis er das erreicht}
, an welcher Stelle es nach rechts abbiegt. In der reflektierten Version steht die IP im ursprünglichen Programm in der obersten Zeile. Wenn Sie in der Originalversion nach rechts drehen, wird sofort die angrenzende{
IP-Adresse berührt, wobei die IP-Adresse in der unteren Zeile des Originalprogramms angezeigt wird.Als nächstes folgen die beiden Schrägstriche in der zweiten Spalte. Wenn das Programm horizontal ausgerichtet ist, wechselt eine der beiden Arten von Schrägstrichen einfach in den Ordnungsmodus und sendet die IP in die gleiche Richtung nach links / rechts, in der sie bereits ausgeführt wurde. Wenn das Programm vertikal ausgerichtet ist, springt die IP-Adresse viel mehr herum, aber wenn Sie beide Schrägstriche verwenden, erhalten Sie dasselbe Endergebnis. (Zwei umgekehrte Schrägstriche würden das entgegengesetzte Ergebnis ergeben, und einer von jedem würde eine Endlosschleife erzeugen.)
Der Rest des Programms ist unkompliziert. Die IP im ordinalen Modus springt diagonal ab. Je nachdem, wie dieser Abschnitt eingegeben wurde, wird sie entweder ausgeführt
"left"o@
oder"right"o@
ausgeführt.quelle
Hexagony , 98 Bytes
Probieren Sie es online! | 90 ° gedreht | 180 ° gedreht | 270 ° gedreht
Umgekehrt | 90 ° gedreht & umgekehrt | 180 ° gedreht & umgekehrt | 270 ° gedreht und umgekehrt
Hexagony hat bei dieser Herausforderung Spaß gemacht, da eine Drehung oder Umkehrung das eigentliche Programm drastisch verändern kann. Jede Drehung / Umkehrung ist ein eigenes Programm. Einige der Programmausführungspfade sind viel interessanter als andere.
Ich gebe zu, dass es länger gedauert hat, als es wahrscheinlich hätte dauern sollen. Ich bin mir ziemlich sicher, dass eine kürzere Antwort in Hexagony möglich ist, also viel Glück!
quelle
Rubin , 131 Bytes
Probieren Sie es online!
quelle
APL (Dzaima / APL) , 181 Bytes
Das Programm ist rotationssymmetrisch, sodass nur zwei Fälle geprüft werden müssen
Links
Probieren Sie es online!
Richtig
Probieren Sie es online!
Erläuterung
Dies ist mein erstes APL-Programm, es ist also ziemlich einfach. Es wird nur ein Trick verwendet, den ich für interessant halte.
Wenn wir alle Kommentare entfernen, erhalten wir die folgenden Programme
Links
Richtig
Ausgehend vom linken Programm machen wir drei Dinge.
Weisen Sie
'lef'
der Variablen zut
Drucken Sie die Variable
t
und den Buchstaben't'
Weisen Sie
'righ'
der Variablen zut
Da es sich nun um den Spiegel handelt, führt das richtige Programm diese drei Schritte in umgekehrter Reihenfolge aus. Dies bedeutet, dass wir
'left'
für das linke Programm und'right'
für das rechte Programm drucken .Der einzige Trick dabei ist, dass das
't'
tatsächlich von einer gedrehten Kopie des Codes kommt. Wenn Sie sich die dritte Spalte unseres Codes ansehen, werden Sie feststellen, dass dies der Fall ist't'
. Wir verwenden dies't'
in den gedrehten Versionen erneut, um das Notwendige anzuhängent
.quelle
Haskell ,
461379 Bytes82 Bytes von Ørjan Johansen gespeichert
Probieren Sie es online!
Da diese 4-fache Symmetrie hat, müssen Sie nur den Spiegel testen:
Probieren Sie es online!
Dies ist ein Anfang. Es ist alles andere als ideal, aber es gibt ein paar interessante Dinge, die hier vor sich gehen. Haskell ist sicherlich eine interessante Sprache für diese Herausforderung. Ich freue mich auf eine Antwort, die besser ist als meine oder die einer anderen Person.
quelle
Prolog (SWI) ,
649.188BytesNicht gedreht, nicht gedreht
Probieren Sie es online!
Ungewendet, gedreht
Probieren Sie es online!
Umgedreht, nicht gedreht
Probieren Sie es online!
Umgedreht, gedreht
Probieren Sie es online!
quelle
Prolog (SWI) ,
239223209181 BytesProbieren Sie es online!
Da das Programm eine 4-fache Symmetrie hat, müssen Sie nur den Spiegel überprüfen:
Probieren Sie es online!
quelle
Python 2 , 209 Bytes (14 x 14)
Normal (links):
Probieren Sie es online!
Reflektiert (rechts):
Probieren Sie es online!
quelle
Sauber ,
13311055 Bytes-276 Bytes dank Ørjan Johansen
Versuchen Sie "links" online!
Online "richtig" testen!
Das war aus vielen Gründen schwierig:
module <filename>
dass am Anfang ein Dateikopf und nur der Anfang der Datei vorhanden ist. Leider bedeutet dies, dass die Rotationen des gespiegelten Programms auch am Ende der Datei angezeigt werden müssen, damit sie gültig sind. Um diesen noch schlimmer zu machen,module ..
ist ungültig für die globalen,let .. in
,where ..
undwith ..
Definitionen; und das Tokenmodule
, das angezeigt wird , wenn es nicht definiert wurde, verursacht einen Fehler./* /* */
Lässt eine Kommentarebene offen,/* // */
ebenso wie das Auskommentieren des Restes der Zeile.Glücklicherweise wir können definieren ,
module
wie etwas in einem#..
(let-vor) Ausdruck, der alles , was wir brauchen ist. Da Clean keine Alternativen prüft, die niemals verwendet werden (und eine Vielzahl anderer, ebenfalls nicht verwendeter Dinge), kann die erforderliche zweite Definition vonStart
Müll vollständig sein. Auf diese Weise können wir die zweite verwendenStart
, um den Modulheader am Ende der Datei zu belegen, da Cleanm module m
die Funktionm
onmodule
und aufruftm
(was, da wirmodule
and definiert habenm
, keinen Fehler verursacht). Es spielt keine Rolle, dassm
es sich um eine Zeichenfolge und nicht um eine Funktion handelt, da dieStart
Alternative niemals einer Typprüfung unterzogen wird.Dies ist einfacher zu sehen, wenn Sie es mit den Augen des Compilers betrachten:
quelle
m
unds
.Brachylog , 341 Bytes
Probieren Sie es online!
! enilno ti yrT
Nutzt den Vorteil von Brachylog, dass das Hauptprädikat in der ersten Zeile steht und die anderen Zeilen nicht so wichtig sind, als dass sie kompiliert werden müssen. Unreflektiert wird eine leere Zeichenfolge gefolgt von "left" in derselben Zeile ausgegeben, und gespiegelt wird eine leere Zeichenfolge gefolgt von "right" in derselben Zeile. Ich bin versucht zu glauben, dass es eine Möglichkeit gibt, eine (sinnvolle) nicht-quadratische Version zu
ṇ
erstellen, aber das könnte eine Menge schwieriger sein, ohne zu versuchen, sie unter Reflektion anders zu gestalten.quelle
Ruby , 181 Bytes
Probieren Sie es online!
Dies ist eine Portierung der Python-Antwort von Curtis Bechtel auf Ruby, die ein wenig mehr Golf gespielt hat.
Eigentlich ist sein Python-Programm ein Polyglott und läuft auch unter Ruby, also war meine erste Antwort das Kopieren, aber es schien unfair. Also habe ich ein Skript geschrieben, das ausgehend von einem Basisskript eine neue Antwort generiert. Sie können es hier ausprobieren:
Bau dein eigenes
quelle
Batch,
438321 BytesErläuterung: Mit A
:
wird eine Beschriftung angegeben, die so gut wie ein Kommentar ist. Da das Programm also rotationssymmetrisch ist, besteht der einzige Unterschied zwischen den beiden Versionen darin, welche der@
Zeilen die erste ist. In diesem Fall wird entwederleft
oderright
vor dem Skript ausgegeben Ausgänge.Ich habe versucht, die gedrehten Linien kreativ miteinander zu überlappen, aber mein Versuch endete tatsächlich mit einem größeren Raster.
Bearbeiten: 117 Bytes dank @ ØrjanJohansen gespeichert.
quelle
&rem
durch&:
.test.bat
in der Win10-Eingabeaufforderung (es macht Haskell nichts aus, TIO scheint Batch nicht zu haben) .CMD.EXE
oder so gewesen sein.05AB1E (legacy) ,
8955 BytesSehr einfacher Ansatz. Ausgabe in Kleinbuchstaben.
Probieren Sie es online oder online aus (jede Umdrehung ist gleich).
Erläuterung:
Rückgängig gemacht:
Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie verwende ich das Wörterbuch? ) An, um zu verstehen, warum es
'…¸
ist"left"
und'ĩ
ist"right"
.quelle
q
?(legacy)
Version von 05AB1E verwendet habe.Stax , 131 Bytes
Führen Sie es aus und debuggen Sie es
Dies ist die "richtige" Variante.
quelle
Runenverzauberungen , 116 Bytes
Probieren Sie es online!
Und umgekehrt
Nicht gerade ein Port, sondern als Ausgangspunkt die Klein 000-Antwort von Post Left Garf Hunter , da beide Sprachen nahezu kompatibel sind (die meisten Befehle sind gleich und der Kantenumbruch in Runic ist identisch mit Klein 000). Das einzige Problem war, dass Klein-IPs immer von links oben beginnen und Runic's nicht. Als solche
.
sind sie alle Teil des ursprünglichen Codes und werden von Runic immer noch als NOP behandelt, während dieNOPs ich als Teil der Flusssteuerung hinzufügen musste.
Druckt
"left"
in allen 4 Umdrehungen und"right"
im gespiegelten Zustand (und in allen vier Umdrehungen davon). Zwei mittlere Spalten waren nach meinen Änderungen völlig unbenutzt, so dass ich sie entfernen konnte.Theoretisch könnte eine Rotation mit vielen nachgestellten Leerzeichen für eine niedrigere Bytezahl verwendet werden (z. B. diese Variante ), die Leerzeichen werden jedoch benötigt, um die Struktur mit externen Werkzeugen korrekt zu drehen, und so habe ich sie eingeschlossen.
Die folgenden Varianten enthalten die nicht verwendeten Teile, die entfernt wurden, aber ansonsten identisch sind:
Alle vier links . Ausgänge
leftleftleftleft
(die Tatsache, dass alle vier so ausgeführt werden können, ist Zufall).Richtig 1 , Richtig 2 , Richtig 3 , Richtig 4
quelle
Gol> <> , 342 Bytes
Beeindruckend! Das hat länger gedauert, als ich erwartet hatte, als mir auf halbem Weg klar wurde, dass die Reflexion vertikal und nicht horizontal war, wie ich es mir vorgestellt hatte! Ich bin mir ziemlich sicher, dass dies funktioniert, aber wenn ich einen Fehler gemacht habe, lassen Sie es mich bitte wissen. Dies kann höchstwahrscheinlich eine lächerliche Menge mehr golfen werden, ich habe gerade eine extreme Brute-Force-Methode angewendet, um dies zu tun. Die Form selbst ist eigentlich ein Quadrat, sie ist technisch symmetrisch, außer auf der x-Achse. Wenn sie also umgedreht wird, wird stattdessen "RECHTS" zurückgegeben !!!
Der Charakter, der dieses Programm möglich gemacht hat, ist das 'A', das das Teleportieren an den Anfang einer bestimmten Zeile ermöglicht!
Probieren Sie es online!
quelle