Schreiben Sie ein Programm oder eine Funktion, die ein 4 × 4-Textraster enthält, das aus genau 4 A
, 4 B
, 4 C
und 4 besteht D
, wie z.
ACDC
BBCA
BADD
ABCD
Die ABCD
können in jeder Anordnung sein, aber es werden immer 4 von jedem sein. Sie können davon ausgehen, dass die Eingabe gültig ist. Auf Wunsch können Sie auch davon ausgehen, dass es sich um eine nachgestellte Zeile handelt und / oder dass es sich um eine einzelne Zeile in Lesereihenfolge handelt, z ACDCBBCABADDABCD
. Falls gewünscht, können Sie die Zeichen auch ABCD
durch 0123
oder ersetzen 1234
(aber das ist alles).
Geben Sie einen Wahrheitswert aus, wenn das Textgitter irgendeine Form von Reflexions- oder Rotationssymmetrie aufweist. Speziell:
Wenn es eine zentrale horizontale Symmetrielinie gibt. z.B
BACD BACD BACD \___ bottom mirrors top BACD /
Wenn es eine zentrale vertikale Symmetrielinie gibt. z.B
BCCB DAAD CAAC BDDB \/___ right mirrors left
Wenn es eine diagonale Symmetrielinie gibt (in beide Richtungen). z.B
___ diagonally mirrored / ABDC BACD DCAB CDBA \___ diagonally mirrored
Bei 90 ° Rotationssymmetrie. z.B
BDAB ACCD same if rotated 90 degrees (or 180 or 270) DCCA BADB
Bei 180 ° Rotationssymmetrie. z.B
DBCA BDCA same if rotated 180 degrees ACDB ACBD
(Beachten Sie, dass die translatorische Symmetrie hier nicht ins Spiel kommt.)
Geben Sie einen falschen Wert aus, wenn das Raster keine der oben genannten Symmetrien aufweist. zB das allererste Beispielraster.
Der kürzeste Code in Bytes gewinnt.
Antworten:
CJam, 16 Bytes
Ein unbenannter Block, der die Eingabe als Liste von vier Zeichenfolgen über dem Stapel erwartet und
0
für asymmetrische Eingaben eine (falsy) und für symmetrische Eingaben eine positive Ganzzahl (truthy) zurücklässt.Teste es hier. Oder führen Sie eine vollständige Testsuite aus.
Erläuterung
Die Symmetrien des Quadrats sind die Elemente der Diedergruppe der Ordnung 8 (die nur die 4 Umdrehungen des Quadrats und die gleichen 4 Umdrehungen einer reflektierten Version des Quadrats sind). Es ist nicht möglich, diese Gruppe durch wiederholtes Anwenden einer einzelnen Permutation zu generieren. Zwei Reflexionen ergeben jedoch immer eine gewisse Rotation. Somit kann die gesamte Gruppe erzeugt werden, indem viermal zwischen zwei Reflexionen gewechselt wird. (Wir müssen nur sicherstellen, dass die beiden Reflexionen eine 90-Grad- oder 270-Grad-Drehung ergeben, nicht 0 oder 180.)
Bei der Abfrage wird gefragt, ob das Eingangsquadrat einer der anderen 7 Symmetrien entspricht. Diese Antwort generiert also nur alle von ihnen und prüft dann, ob die Eingabe unter den anderen ist.
Um zu sehen, wie das wiederholte Anwenden
z
undW%
Erzeugen aller Symmetrien erfolgt, schauen Sie sich dieses "Diagramm" an:quelle
z
transponieren undW%
die Linien umkehren, so dass ich nur alle Symmetrien durch wiederholtes Anwenden dieser generiere.Pyth, 11 Bytes
Testsuite
Dies verwendet Martins Transponierungs- und Umkehrtechnik, jedoch mit einem gewissen Dreh. Während andere Lösungen alle 8 Symmetrien explizit generiert und dann die Anzahl der Erscheinungsbilder des Originals gezählt haben, verwendet dieses Programm die Pyth-
.u
Funktion.Die
.u
Funktion ist "Übernehmen bis Wiederholung gefunden". In diesem Fall transponieren und kehren wir abwechselnd um, bis eine Wiederholung auftritt, und akkumulieren dann die Ergebnisse in einer Liste. Dann entferne ich die letzten 7 Werte, sodass nur ein Wert übrig bleibt, wenn keine Symmetrien vorhanden sind, und die erste Wiederholung erfolgt, nachdem alle 8 Reflexionen und Wiederholungen generiert wurden.Erläuterung:
quelle
05AB1E , 13 Bytes
Erläuterung
Verwendet die Methode, die Martin in seiner CJam-Antwort fachmännisch erklärt hat .
Probieren Sie es online aus
quelle
Perl,
61-60BytesBeinhaltet +3 für
-p0a
Geben Sie bei STDIN ein Quadrat ein, und geben Sie 0 aus, wenn keine Symmetrie vorliegt. Andernfalls wird eine positive Zahl ausgegeben
symmetry.pl
:quelle
Dyalog APL ,
371917 Bytes@ngn hat es um 20 Bytes reduziert!
TryAPL online!
quelle
⍉¨
anstatt auch⌽∘⍉¨
zu arbeiten.Brachylog ,
3836 BytesProbieren Sie es online!
Dies erwartet eine Liste von Zeichenfolgen als Eingabe. Dies druckt entweder
true.
oderfalse.
.Erläuterung
Hauptprädikat:
Prädikat 1: Die Ausgabe ist eine der 8 Symmetrien der Eingabe.
quelle
TSQL, 229 Bytes
Beachten Sie, dass TSQL kein integriertes Programm zum Drehen hat. Daher ist dies im Code enthalten.
Golf gespielt:
Ungolfed:
Geige
quelle
Python 2,
154146 BytesÜberprüft mithilfe von Numpy-Arrays, ob eine der erforderlichen Transformationen dem Original entspricht. Die Eingabe wird als Liste von vier Zeichenfolgen verwendet.
Probieren Sie es online aus
Die Eingabe als einzelne Zeichenfolge ist mit ein Zeichen länger
A=array(list(input())).reshape(4,4)
.A[:,::-1]
ist das gleiche wiefliplr(A)
.A[::-1]
ist das gleiche wieflipud(A)
.quelle
map(list,input())
anstelle von[list(r)for r in input()]
any
Nimmt einen Generatorausdruck an, sodass Sie einige Bytes sparen können, indem Sie das äußere Paar eckiger Klammern entfernen.print
Anweisung nicht funktioniert. Versuchen Sie, meinen Online-Code zu forken und auf diese Weise auszuführen.print
.Python 3, 99 Bytes
Eine Funktion, die über ein Argument eine Liste von Zeichenfolgen eingibt und zurückgibt
True
oderFalse
die relevant ist.Dies verwendet den gleichen Ansatz wie @ MartinEnder die Antwort .
Wie es funktioniert
Probieren Sie es auf Ideone
quelle
JavaScript (ES6), 131 Byte
17 Bytes könnten entfernt werden, wenn Sie ein Array von 4 Strings direkt übergeben. Ich habe Bit-Twiddling (Eingabe im
"0123301223011230"
Format) versucht, aber das hat mir 199 Bytes gekostet :quelle