Stellen Sie sich vor, wir haben ein Polyomino und möchten es eindeutig identifizieren, aber die Polyominos können gedreht werden, so dass sie blindlings nicht den gleichen Fingerabdruck für ein Stück und eine Drehung davon (im Allgemeinen) ergeben.
Zum Beispiel, wenn wir den L-Tetromino haben
x
x
xx
Wir möchten, dass es den gleichen Fingerabdruck wie die folgenden hat:
xx
x x xxx
xxx , x or x
Hinweis: Wir erlauben nur Rotationen in der Ebene (dh es handelt sich um einseitige Polyominos) und daher wäre das folgende Polyomino ein anderes:
x
x
xx
Herausforderung
Die Aufgabe für diese Herausforderung ist eine Abnahme von Fingerabdrücken-Funktion / Programm zu implementieren , die eine nimmt Boolean / -wertigen Matrix / Liste von Listen / string / .. Codieren eines polyomino und gibt einen String - den Fingerabdruck eines polyomino . Der Fingerabdruck muss für alle möglichen Rotationen gleich sein (in der Regel 4).
Input-Output
- und (dh kein leeres Polyomino)
- Sie haben die Garantie, dass so klein wie möglich ist (dh alle werden auf und n zugeschnitten)
- Ihnen wird garantiert, dass der Eingang ist
- einfach verbunden
- hat keine Löcher
- output muss eine Zeichenfolge sein, die für jede mögliche Drehung eines Polyominos gleich ist
Beispiele
Hier sind einige Äquivalenzklassen: Für jede Klasse muss der Fingerabdruck derselbe sein und für zwei beliebige Polyominos aus zwei verschiedenen Klassen müssen sie sich unterscheiden.
Die Drehungen des L-Tetrominos aus dem Beispiel:
[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]
Der J-Tetromino:
[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]
Die Einheit Polyomino:
[[1]]
A bar:
[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]
Eine Ecke:
[[1,1],[1,0]]
[[1,0],[1,1]]
[[0,1],[1,1]]
[[1,1],[0,1]]
W-Pentomino:
[[1,0,0],[1,1,0],[0,1,1]]
[[0,0,1],[0,1,1],[1,1,0]]
[[1,1,0],[0,1,1],[0,0,1]]
[[0,1,1],[1,1,0],[1,0,0]]
""
(die leere Zeichenfolge) ausgegeben habe , habe ich alle Anforderungen erfüllt?Antworten:
Python 2 , 48 Bytes
Probieren Sie es online!
Nimmt die größte der vier Umdrehungen in Bezug auf den Listenvergleich ein. Basierend auf der FlipTack-Lösung .
Der Code verwendet die Fähigkeit von Python 2, Objekte verschiedener Typen zu vergleichen. Der Basisfallwert von
0
ist harmlos,max
weil er kleiner als jede Liste ist. Außerdemzip
erzeugt eine Liste von Tupeln , während die Eingabe eine Liste von Listen, aber Tupel größer ist als Listen , damit die Eingabeliste-of-Listen sind nie ein Anwärter. Aus diesem Grund drehen wir uns fünfmal anstatt viermal, sodass wir zu einer vervielfältigten Version der ursprünglichen Liste zurückkehren. (Das Aufnehmen einer Liste von Tupeln würde auch funktionieren, wenn dies eine zulässige Form der Eingabe ist.)quelle
Python 3 , 63 Bytes
Probieren Sie es online!
Findet die Rotation mit dem lexografischen Minimum und druckt diese aus.
Eine Lambda-Form kommt mit der gleichen Anzahl von Bytes:
Probieren Sie es online!
quelle
lambda
kann man bis 58 bekommenlambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M)
. Funktioniert daexec
immer wiederNone
.M
bereits besiedelt ...M[-4:]
wenn man das Problem mit berücksichtigt, kann man auf die gleiche Byteanzahl kommen.Gelee , 5 Bytes
Probieren Sie es online!
Volles Programm.
Erzeugt einfach alle möglichen Rotationen und wählt das lexikografische Minimum aus.
Beachten Sie, dass Singleton-Listen
[]
in der Ausgabe nicht eingeschlossen sind. Dies spielt keine Rolle, da der einzige Fall, in dem Singleton-Listen in der Eingabe vorhanden wären, eine vertikale Linie (einschließlich der Einheit Polyomino) ist, die mit einer horizontalen Linie mit derselben Größe (in der die Listen nicht umbrochen sind) identisch ist ). Der einzige Fall, in dem das Äußere[]
auch nicht existiert, ist die Einheit Polyomino.quelle
Sauber , 136 Bytes
Probieren Sie es online!
Beinhaltet Testverifizierer.
quelle
K (ngn / k) , 16 Bytes
Probieren Sie es online!
min Umdrehungen
{
}
Funktion mit Argumentx
{+|x}
drehen, dh umkehren (|
) und transponieren (+
)3{
}\
dreimal auftragen, dabei Zwischenergebnisse erhalten; Dies gibt eine Liste der 4 Umdrehungen zurücka:
zuweisena
<
ascend (berechne die sortiere aufsteigende Permutation)*
zuersta@
Indexa
damitquelle
Japt
-g
, 6 BytesVersuch es
quelle
-g
Flagge notwendig? Sortieren sollte bedeuten, dass alle anfänglichen Rotationen mit derselben Liste enden, sodass die vollständige Liste als Fingerabdruck gut funktionieren sollte, es sei denn, mir fehlt etwas.J , 16 Bytes
-2 Bytes dank Shaggy
Probieren Sie es online!
J , 18 Bytes
Probieren Sie es online!
Gibt das erste Element in der Liste der lexikographisch sortierten Rotationen des Polyominos zurück.
Erläuterung:
quelle
05AB1E ,
108 Bytes-2 Bytes dank @Shaggy .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
HINWEIS: Wenn Sie das Minimum mit
ß
oderW
nehmen, wird die Ausgabe implizit abgeflacht0
. Und das Sortieren mit{
scheint für eine Liste von Matrizen nicht zu funktionieren, weshalb ichΣ˜
stattdessen verwende.quelle
}
implizit gemacht wird, wenn nichts danach kommt.