Die Diedergruppe ist die Symmetriegruppe des Quadrats, dh die Bewegungen, die ein Quadrat durch Rotationen und Reflexionen in sich selbst transformieren. Es besteht aus 8 Elementen: Rotationen um 0, 90, 180 und 270 Grad sowie Reflexionen über die horizontale, vertikale und zwei diagonale Achsen.
Die Bilder stammen alle von dieser schönen Seite von Larry Riddle.
Bei dieser Herausforderung geht es darum, diese Züge zu komponieren: Geben Sie bei zwei Zügen den Zug aus, der gleichbedeutend damit ist, sie nacheinander auszuführen. Zum Beispiel ist das Ausführen von Zug 7, gefolgt von Zug 4, dasselbe wie das Ausführen von Zug 5.
Beachten Sie, dass das Umschalten der Reihenfolge auf Zug 4 und dann auf Zug 7 zu Zug 6 führt.
Die Ergebnisse sind unten tabellarisch aufgeführt. Dies ist der Cayley-Tisch der Gruppe . So sollten beispielsweise die Eingänge Ausgang erzeugen .
Herausforderung
Ihr Ziel ist es, diese Operation in so wenigen Bytes wie möglich zu implementieren. Zusätzlich zum Code wählen Sie auch die Bezeichnungen , die die Schritte 1 bis 8 darstellen. Die Bezeichnungen müssen 8 verschiedene Zahlen von 0 bis 255 oder die 8 sein -byte Zeichen, die ihre Codepunkte darstellen.
Ihr Code erhält zwei der von Ihnen ausgewählten 8 Etiketten und muss das Etikett ausgeben, das ihrer Zusammensetzung in der Diedergruppe .
Beispiel
Angenommen, Sie haben die Zeichen C, O, M, P, U, T, E und R für die Züge 1 bis 8 ausgewählt. Dann sollte Ihr Code diese Tabelle implementieren.
Bei den Eingaben E und P sollten Sie U ausgeben. Ihre Eingaben bestehen immer aus zwei der Buchstaben C, O, M, P, U, T, E, R, und Ihre Ausgabe sollte immer aus einem dieser Buchstaben bestehen.
Texttabelle zum Kopieren
1 2 3 4 5 6 7 8
2 3 4 1 8 7 5 6
3 4 1 2 6 5 8 7
4 1 2 3 7 8 6 5
5 7 6 8 1 3 2 4
6 8 5 7 3 1 4 2
7 6 8 5 4 2 1 3
8 5 7 6 2 4 3 1
Your choice of labels doesn't count against your code length.
etwas dagegen auszuarbeiten? So wie es aussieht, kann ich die Matrix fest in meinen Code einkodieren und behaupten, dass sie nicht für meine Punktzahl zählt.Antworten:
Ruby , 18 Bytes
Ungolfed
Probieren Sie es online!
Verwendet die folgenden Codierungsnummern 0 bis 7
In der Reihenfolge, in der der Code vorkommt:
In der Reihenfolge nach der Frage
Erläuterung
/
repräsentiert einen Flip in der Liniey=x
und|
repräsentiert einen Flip in der y-Achse.Es ist möglich , irgendeine der Symmetrien der Gruppe D4 durch abwechselndes Umklappen in diesen beiden Linien zu erzeugen , zum Beispiel
/
gefolgt von|
verleiht/|
die eine Drehung von 90 Grad gegen den Uhrzeigersinn ist.Die Gesamtzahl der aufeinanderfolgenden Flips bietet eine sehr bequeme Darstellung für die arithmetische Manipulation.
Wenn der erste Zug eine Rotation ist, können wir einfach die Anzahl der Flips addieren:
Wenn der erste Zug eine Reflexion ist, haben wir einige identische Reflexionen
/
und|
Symbole nebeneinander. Da die Reflexion selbstinvers ist, können wir diese Umkehrungen nacheinander aufheben. Wir müssen also einen Zug vom anderen abziehenquelle
~0
mit7
durch modulare Arithmetik.Wolfram Language (Mathematica) , 31 Byte
Verwenden von Ganzzahlen0,5,2,7,1,3,6,4 als Beschriftungen.
Probieren Sie es online!
Erläuterung:
And we have
which can easily be written in bitwise operations.
quelle
Wolfram Language (Mathematica), 51 bytes
Try it online!
Using labels
{228, 57, 78, 147, 27, 177, 198, 108}
.These are
{3210, 0321, 1032, 2103, 0123, 2301, 3012, 1230}
in base 4. Fortunately, 256=4^4.Lower-level implementation, also 51 bytes
Try it online!
quelle
Python 2, 22 bytes
A port of my Mathematica answer. Using integers0,6,1,7,2,3,5,4 as labels.
Try it online!
quelle
Python 2 ,
262321 BytesProbieren Sie es online! Port meiner Antwort an Cayley Table von der Dihedral GroupD3 . Bearbeiten: 3 Bytes dank @NieDzejkob gespeichert. 2 Bytes gespart dank @xnor für den Vorschlag des Operators
and
(anstattxnor
). Verwendet die folgende Zuordnung:quelle
(-1)
mit ,7
weil für -3 Bytes modularer Arithmetik.y+x*7**y&7
TI-BASIC, 165 Bytes
Die Eingabe ist eine Liste mit einer Länge von zwei Zoll
Ans
.Ausgabe ist die Nummer am
(row, column)
Index in der Tabelle.Es könnte eine bessere Komprimierungsmethode geben, die Bytes einspart, aber ich muss mich darum kümmern.
Beispiele:
Erläuterung:
(Zeilenumbrüche wurden zur besseren Lesbarkeit hinzugefügt.)
Hier ist eine 155-Byte- Lösung, die jedoch nur die Matrix fest codiert und den Index abruft.
Ich fand es langweiliger, also habe ich es nicht zu meiner offiziellen Einreichung gemacht:
Hinweis: TI-BASIC ist eine Token-Sprache. Die Anzahl der Zeichen entspricht nicht der Anzahl der Bytes.
quelle
0-7
zu1-8
Gelee , 6 Bytes
Ein dyadischer Link, der die erste Transformation rechts und die zweite Transformation links akzeptiert und die zusammengesetzte Transformation ergibt.
Wo die Transformationen sind:
Probieren Sie es online! ... oder sehen Sie sich die Tabelle wieder auf den Etiketten in der Frage abgebildet .
(Die Argumente können in der anderen Reihenfolge mit dem 6-Byte-
_+Ḃ?%8
)Wie?
Jedes Label ist die Länge einer Sequenz von Wechsel-
hor
und+ve
Transformationen, die der Transformation entspricht (z. B.180
entsprichthor, +ve, hor, +ve
).Die Komposition
A,B
ist gleichbedeutend mit der Verkettung der beiden äquivalenten Sequenzen und ermöglicht eine Vereinfachung der Subtraktion oder Addition ...Anhand des
7, 4
Beispiels der Frage haben wir folgendes+ve, 90c
:hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve
... aber da
hor, hor
istid
haben wir:hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve
... und da
+ve, +ve
istid
haben wir:hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve
... und wir können diese Absagen wiederholen, um:
hor
..äquivalent zum Subtrahieren der Längen (
7-6=1
).Wenn keine Stornierungen möglich sind, addieren wir nur die Längen (wie→ →
90a, 180
2+4=6
90c
).Schließlich ist zu beachten, dass eine Sequenz der Länge acht ist,
id
damit wir die resultierende Sequenzlänge modulo acht nehmen können.Es ist auch 1 Byte kürzer als diese Implementierung mit lexikografischen Permutationsindizes:
... ein monadischer Link, der akzeptiert
[first, second]
, mit Labels:quelle
JavaScript (Node.js) ,
22 bis17 ByteProbieren Sie es online! Port meiner Antwort an Cayley Table von der Dihedral GroupD3 aber mit den Vorschlägen auf meiner Python-Antwort nach unten Golf gespielt. Verwendet die folgende Zuordnung:
Ältere Versionen von JavaScript können für 22 Byte auf verschiedene Arten unterstützt werden:
quelle
x=>y=>(y&1?y-x:y+x)&7
aufrufen, und rufen Sie Ihre Funktion mit auff(x)(y)
.Rust , 16 Bytes
Probieren Sie es online!
Port of Alephalphas Python Antwort. Aber kürzer.
quelle
Ulme ,
42 Bytes19 BytesPort der Neil's Node.js Version
Probieren Sie es online aus
Vorherige Version:
quelle
f x
die ein Funktionsaufruf ist, genau wie das, wasf(x)
in C-ähnlichen Sprachen bedeutet. Und du kannst nichts dafür. Aber es kann in vielen Nicht-Golf-Szenarien sehr schön und übersichtlich sein. Elm hat keine bitweisen Operatoren (wie &), daherand x y
handelt es sich hier nur um einen einfachen Funktionsaufruf.<|
anstelle von Klammern abzuschneiden . Danke, dass du das in Frage stellst!Python,
8271 Bytes0-7
-11 Bytes nur dank ASCII
TIO
quelle
f=
kann, da es nicht rekursiv istint.from_bytes
sieht so aus, als ob Sie mit und ohne UTF-Codierung bessere Ergebnisse erzielen könnten , aber ... ich bin mir nicht sicher, wie ich das mit TIO machen sollScala , 161 Bytes
Auswahl von COMPUTER als Beschriftung.
Probieren Sie es online!
quelle
Scala , 70 Bytes
Auswahl von 0-7 nativen Ganzzahlen als Bezeichnungen.
Komprimierte die Matrix in eine 32-Byte-ASCII-Zeichenfolge, wobei jedes Zahlenpaar n0, n1 in 1 Zeichen c = n0 + 8 * n1 + 49 ist. Ab 49 ist in der codierten Zeichenfolge kein \ enthalten.
Probieren Sie es online!
quelle
C # (Visual C # Interactive Compiler) , 17 Byte
Port of Alpehalpha's Python Antwort.
Probieren Sie es online!
quelle
Perl 6 , 19 Bytes
Port von Neils Python-Lösung .
Probieren Sie es online!
quelle
Wolfram Language (Mathematica), 7 Byte (UTF-8-Codierung)
Eine reine Funktion mit zwei Argumenten. Das hier als gerenderte Symbol
⊙
ist tatsächlich das private Unicode-Symbol F3DE (3 Byte) von Mathematica, das die Funktion darstelltPermutationProduct
.Mathematica kennt sich mit Flächengruppen aus und repräsentiert die Elemente verschiedener Gruppen als Permutationen, die mit dem
Cycles
Befehl geschrieben wurden. Führen Sie beispielsweise den Befehl ausergibt die Ausgabe:
PermutationProduct
ist die Funktion, die Gruppenelemente multipliziert, wenn sie in dieser Form geschrieben werden.Da wir unsere eigenen Bezeichnungen auswählen dürfen, übernimmt diese Funktion diese Bezeichnungen für die Gruppenelemente. Die Zuordnung zwischen diesen Labels und denen im Problembeitrag ist gegeben durch:
Es gibt einen eingebauten.
quelle