Bei einer vorzeichenlosen 16-Bit-Ganzzahl N müssen Sie feststellen, ob ihre in einer 4x4-Matrix abgebildete Binärdarstellung mit einer Tetrominoform übereinstimmt , und wenn ja, welche Form es ist.
Matrix
Jedes Bit von N wird in einer 4x4-Matrix von links nach rechts und von oben nach unten abgebildet, beginnend mit dem höchstwertigen.
Beispiel :
N = 17600
binary representation: 0100010011000000
matrix: [ [ 0, 1, 0, 0 ],
[ 0, 1, 0, 0 ],
[ 1, 1, 0, 0 ],
[ 0, 0, 0, 0 ] ]
Tetromino-Formen
Grundformen
Es gibt 7 Tetrominoformen, die mit den Buchstaben O , I , S , Z , L , J und T gekennzeichnet sind :
Rotationen und Übersetzungen
Wenn eine Form innerhalb der 4x4-Matrix verschoben und / oder gedreht wird, wird sie weiterhin als gültige Variation desselben Tetrominos betrachtet. Zum Beispiel sollten 17600, 1136, 2272 und 1604 alle als J- Tetrominos identifiziert werden :
Wickeln Sie nicht!
Die Formen können jedoch nicht über die Grenzen der Matrix hinaus gewickelt oder verschoben werden. Zum Beispiel sollten weder 568 noch 688 als J- Tetrominoe identifiziert werden (geschweige denn irgendeine andere Form):
Erläuterungen und Regeln
- Sie können Eingaben als Ganzzahl oder direkt als 16 Binärziffern in einem beliebigen vernünftigen Format, z. B. einem 2D-Array, einem flachen Array oder einer durch Trennzeichen getrennten Zeichenfolge, annehmen.
- Bei der Eingabe handelt es sich garantiert um eine 16-Bit-Ganzzahl ohne Vorzeichen (oder die entsprechende Darstellung als Array oder Zeichenfolge).
- Wenn eine gültige Form identifiziert wurde, müssen Sie den Buchstaben , der die Form identifiziert, entweder in Groß- oder Kleinbuchstaben drucken oder zurückgeben .
- Wenn keine Form identifiziert wird, müssen Sie einen Wert drucken oder zurückgeben, der keinem Tetromino-Buchstaben entspricht. Sie können sich auch dafür entscheiden, überhaupt nichts zurückzugeben.
- Um als gültig zu gelten, muss die Matrix die genaue Tetrominoform ohne zusätzliche Zellen enthalten (siehe 1911 und 34953 in den Testfällen).
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
Testfälle
Sie können diesem Link folgen , um die Testfälle als 2D-Arrays abzurufen.
0 -> false
50 -> false
51 -> 'O'
1911 -> false
15 -> 'I'
34952 -> 'I'
34953 -> false
1122 -> 'S'
3168 -> 'Z'
785 -> 'L'
1136 -> 'J'
568 -> false
688 -> false
35968 -> 'T'
19520 -> 'T'
quelle
func1 . func2 . func3
0
, also1111011110111101111
für65535
?15,240,3840,4369,8738,17476,34952,61440
J:71,113,142,226,275,550,802,1100,1136,1604,1808,2272,3208,3616,4400,8800,12832,17600,18176,25664,28928,36352,51328,57856
L:23,46,116,232,368,547,736,785,1094,1570,1856,2188,3140,3712,5888,8752,11776,12560,17504,25120,29696,35008,50240,59392
O:51,102,204,816,1632,3264,13056,26112,52224
S:54,108,561,864,1122,1728,2244,8976,13824,17952,27648,35904
T:39,78,114,228,305,562,610,624,1124,1220,1248,1824,2248,3648,4880,8992,9760,9984,17984,19520,19968,29184,35968,58368
Z:99,198,306,612,1224,1584,3168,4896,9792,19584,25344,50688
Antworten:
Jelly ,
54 43 4241 Bytes-1 Byte dank Erik the Outgolfer (Transponieren innerhalb der wiederholten Kette)
Ein monadischer Link, der ein 2D-Array von Ganzzahlen (
1
s und0
s)oiszljt
aufnimmt und einen Kleinbuchstaben für das jeweilige Tetromino zurückgibt oderw
ungültig ist.Probieren Sie es online! oder sehen Sie sich die Testsuite an .
Sehen Sie sich auch dieses Programm an, das alle 1820 möglichen 2D-Binär-Arrays mit genau vier gesetzten Bits zusammen mit ihren Ausgängen auflistet, sortiert nach diesen Ausgängen.
Wie?
Dies dauert zunächst alle vier Umdrehungen der Eingabe. Dann verschiebt es die gesetzten Bits von jedem so weit wie möglich nach rechts und dann so weit wie möglich nach unten und wandelt die Ergebnisse in Binärzahlen um. Anschließend wird das minimale Ergebnis in einer Liste der minimalen derartigen Darstellungen jedes gültigen Tetrominos nachgeschlagen und das dekrementierte Ergebnis verwendet, um in die beiden verketteten Wörter des Wörterbuchs
zoist
+ zu indexierenjowl
, was ergibt,w
wenn keine Übereinstimmung gefunden wurde.Vorherige Methode (54 Byte)
Ein monadischer Link, der ein 2D-Array von Ganzzahlen (
1
s und0
s)oiszljt
aufnimmt und einen Kleinbuchstaben für das jeweilige Tetromino zurückgibt oderw
ungültig ist.Probieren Sie es online!
Dadurch wird überprüft, ob mindestens drei leere Zeilen (Zeilen + Spalten) vorhanden sind und bestimmte Bitmuster in keiner Zeile vorhanden sind (insbesondere die Zahlen 5, 9, 10, 11 und 13). Diese stellen zusammen sicher, dass der nächste Schritt nicht ergibt Fehlalarm. Anschließend wird die Binärzahl (durch Entfernen von nachgestellten Nullen vor der Konvertierung) für jede der vier Umdrehungen abgeflacht und auf der Grundlage des dekrementierten Ergebnisses durch Indexierung in die beiden verketteten Wörterbuchwörter verschoben
zoist
+jowl
, was ergibt,w
wenn keine Übereinstimmung gefunden wurde.quelle
zoistjowl
sonst normalerweise nicht für eine Zeichenfolge passt: p)...Ṁị“LZOISTJW
sowieso nur ein Byte )ZU$3С
: pPython 3 , 124 Bytes
Probieren Sie es online!
Erwartet eine Ganzzahl n, die eine 4 × 4- Binärmatrix darstellt. Wirft, wenn kein Tetromino gefunden wird.
Zeile 2 verschiebt die Form nach rechts, bis sich eine 1 in der äußersten rechten Spalte befindet. (4369 ist
0001 0001 0001 0001
binär.) Zeile 3 senkt die Form, bis sich eine 1 in der unteren Reihe befindet. Zusammen ergibt dies zB:Dann suchen wir den Index von
n
in dieser Liste:Jede Spalte von Indizes, die dem Modulo 7 äquivalent sind, entspricht einer Tetrominoform. 64 (
@
) wird als Auffüllwert verwendet, dan
an dieser Stelle im Code nicht 64 angegeben werden kann.NB. Anstelle von wird eine Ausnahme für die Eingabe
0
durch Computing ausgelöst .n/n
1
quelle
print("ÿ")
, dass die Bytes geschrieben werden sindc3 bf 0a
, nichtff 0a
, und die PPM Bild verwandelt sich in Müll.APL (Dyalog) ,
9594938987 Bytes-2 Dank an Zacharý
Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist. Nimmt eine Boolesche Matrix (beliebiger Form!) Als Argument. Gibt nichts zurück, wenn die angegebene Anzahl von Bits nicht vier ist, und eine leere Zeile, wenn die vier angegebenen Bits kein Tetromino bilden.Probieren Sie es online!
Erstellt alle vier Umdrehungen der Eingabe und sucht dann in jeder Umdrehung nach jedem Tetromino.
{
…}
Anonyme Funktion, bei der das Argument dargestellt wird durch⍵
:,⍵
das Argument durchkreuzen+/
summiere es4=
ist vier gleich das?:
Wenn ja, dann (sonst nichts zurück):⍳4
ersten vier ɩ ndices;[0,1,2,3]
⍵∘{
…}¨
Wenden auf jede die folgende Funktion an und verwenden die Eingabe als Argument mit fester linker Maustaste⍺
das linke Argument, dh die Eingabe⊢⍺
ergibt das (trennt sich⍵
von⍺
)⌽∘⍉⍣⍵
Spiegel und transponieren (dh um 90 °)⍵
mal(
…)∘.⍷
Äußeres "Produkt", jedoch mit Suchen * der folgenden Liste und der Rotationen:3↑1
Nimm drei Elemente von einem und fülle sie mit Nullen auf.[1,0,0]
K←
Speichern Sie das alsK
⍪
Tabelle (in Spaltenvektor umwandeln);[[1],[0],[0]]
1,
ein eins voranstellen;[[1,1],[1,0],[1,0]]
("J")J←
speichern alsJ
(
…)⊖¨⊂
Das gesamte J vertikal drehen, jeweils mit der folgenden Anzahl von Schritten:⍳3
ersten drei ɩ ntegers;[0,1,2]
wir haben
[[[1,1],[1,0],[1,0]],[[1,0],[1,0],[1,1]],[[1,0],[1,1],[1,0]]]
("J", "L," T ")(
…),
Der folgenden Liste voranstellen:2⊖J
DreheJ
zwei Schritte vertikal.[[1,0],[1,1],[1,0]]
("T")K⌽
Drehen Sie die Zeilen um jeweils 1, 0 und 0 Schritte.[[0,1],[1,1],[1,0]]
("Z")0 1⌽¨⊂
drehen Sie das gesamte Array vertikal, nicht einmal und nicht einmal;[[[0,1],[1,1],[1,0]],[[1,0],[1,1],[0,1]]]
("Z", "S")(
…),
Der folgenden Liste voranstellen:(2 2)4⍴¨1
eine Eins in eine 2 × 2-Matrix und eine 4-Elemente-Liste umformen;[[[1,1],[1,1]],[1,1,1,1]]
("O", "I")1∊¨
Ist einer für jeden ein Mitglied?∨/
horizontale ODER-Reduktion (dh über Rotationen; ein Boolescher Wert für jede Form)'OIZSLJT'/⍨
Verwenden Sie dies, um die Zeichenfolge zu filtern* Find gibt ein boolesches Array mit derselben Form wie das rechte Argument zurück, wobei diejenigen die linke obere Ecke aller Subarrays angeben, die mit dem linken Argument identisch sind.
quelle
{4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}
JavaScript (ES6),
242212172164 BytesSollte nur sein, um den Ball ins Rollen zu bringen, aber ich bin ein bisschen spät dran ¯ \ _ (ツ) _ / ¯
Nimmt eine Folge von Bits, wobei die Zeilen durch
0
s ('0001000110001000000'
stellvertretend für0001 0011 0010 0000
) getrennt sind, und gibt ein Array zurück, das das Zeichen enthält, das das Tetromino darstellt, oder ein Array, das nichts enthält.Dies funktioniert, indem bei jeder Drehung von Tetromino überprüft wird, ob die Eingabe an einem beliebigen Punkt das Tetromino enthält, das auf beiden Seiten vollständig von Nullen umgeben ist. Jedes Tetromino wird durch eine oder mehrere Binärzahlen dargestellt:
Um zu überprüfen, ob die Eingabe ein S-Tetromino enthält, prüfen wir einfach, ob es die binäre Darstellung von entweder
51
oder enthält2145
, wobei sich nur0
s auf beiden Seiten befindet.Einige der Tetrominos haben 4 Ausrichtungen. Wenn Sie sich die binären Darstellungen von diesen ansehen, hat jede 2 Darstellungen, die einfach der Spiegel der anderen beiden sind. Um Platz zu sparen, wird die Binärdarstellung gleichzeitig mit der rekursiven
C
Funktion vorwärts und rückwärts aufgebaut , sodass wir nur zwei der Ausrichtungen einfügen und die anderen beiden implizieren können.Alternativer Ansatz mit Zeichencodes:
quelle
Netzhaut , 125 Bytes
Probieren Sie es online! Der Link enthält Testfälle und einen Header zum Konvertieren von Ganzzahlen in eine 4 × 4-Matrix. Erläuterung:
Löschen Sie die Eingabe, wenn sie 5
1
s enthält .Überprüfen Sie alle Umdrehungen des Eingangs (siehe unten). Wenn die Eingabe vier aufeinanderfolgende
1
s enthält , ist dies eineI
.Wenn es drei aufeinanderfolgende
1
s plus a1
in der nächsten Zeile unter einem der drei Zeichen enthält, ordnen Sie die Anzahl der Zwischenzeichen dem entsprechenden Ergebnisbuchstaben zu.Ähnliches gilt für zwei benachbarte
1
s neben zwei benachbarten1
s in der nächsten Zeile.Aber auch die Anzahl der Umdrehungen mit den ansonsten nicht verwendeten
0
s zählen.Und aufgeben, wenn zu viele Umdrehungen durchgeführt wurden.
Transponieren und kehren Sie das Array um und drehen Sie es so.
quelle
MATL , 60 Bytes
Die Eingabe ist ein binäres 4 × 4-Array (Matrix), das
;
als Zeilentrennzeichen verwendet wird. Ouput ist ein Buchstabe oder leer für kein Tetromino.Probieren Sie es online! Oder überprüfen Sie alle Testfälle (an die Ausgabe ist ein Punkt angehängt, um ein leeres Ergebnis zu identifizieren).
Erläuterung
Der Code erstellt 4 Umdrehungen des 4 × 4-Eingabearrays in Schritten von 90 Grad. Jedes gedrehte Array wird mit 2 Nullen nach oben und unten aufgefüllt, wodurch es in ein 8 × 4-Array umgewandelt wird. Die 4 Arrays sind vertikal zu einem 32 × 4-Array verkettet. Die vier gedrehten Arrays innerhalb dieses verketteten Arrays sind dank der Null-Auffüllung "isoliert".
Jedes der 7 möglichen Muster wird getestet, um festzustellen, ob es im 32 × 4-Array vorhanden ist. Hierfür wird eine Schleife verwendet. Jedes Muster wird durch zwei Zahlen definiert, die in Binärform die entsprechende 0/1-Maske ergeben. Zum Beispiel, Zahlen
3
,6
definieren Sie die "S" -Form.Die 7 Sätze von 2 Zahlen sind in einer 2 × 7-Matrix angeordnet, aus der die Schleife nacheinander jede Spalte auswählt. Die Matrix wird definiert, indem alle Zahlen auf den Stapel verschoben, zu einem Vektor verknüpft und in eine 2-Zeilen-Matrix umgewandelt werden. Da die "I" -Form durch die Zahl 15 gefolgt von der Zahl 0 definiert ist, kann die 0 durch die Umformungsfunktion implizit gefüllt werden, wenn sie am Ende steht.
Die Maske wird dann mit 3 Nullen in den vier Richtungen aufgefüllt. Dies ist notwendig, um unerwünschte Werte in der Eingabe zu erkennen.
Um zu sehen, ob die Maske im 32 × 4-Array vorhanden ist, wird das letztere in eine bipolare Form (dh -1/1 anstelle von 0/1) transformiert und mit der Maske gefaltet. Da die Maske 4 Einsen hat, erfolgt eine Übereinstimmung, wenn ein Eintrag im Faltungsergebnis 4 entspricht.
Am Ende der Schleife wurden 7 falsche / wahre Ergebnisse erhalten, von denen höchstens eines wahr ist. Dies wird verwendet, um einen String zu indizieren, der die möglichen Ausgabebuchstaben enthält.
quelle
Jelly , 53 Bytes
Probieren Sie es online!
Volles Programm. Nimmt einen 4x4. Druckt,
m
wenn kein Tetromino, ansonsten Kleinbuchstaben.quelle
Perl 5 , 197 + 1 (-p) = 198 Bytes
Probieren Sie es online!
Nimmt eine 16-Bit-Zeichenfolge als Eingabe. Gibt nichts aus, wenn der Eingang kein einzelner Tetromino ist.
Wie?
Die beiden Ersetzungen "verschieben" die Eingabeform in die untere rechte Ecke. Die resultierende Bitfolge wird in eine Ganzzahl konvertiert und dann in einem Hash von gültigen Ganzzahlen überprüft.
quelle
APL (Dyalog) , 66 Bytes
{'TIOJSLZ-'[(¯51 144 64,,∘+⍨12J96 ¯48J64)⍳×/(+/-4×⊢)⍵/,0j1⊥¨⍳4 4]}
Probieren Sie es online!
Das Argument ist ein Boolescher Vektor.
Berechnet die vorzeichenbehafteten Abstände der Punkte zu ihrem Schwerpunkt als komplexe Zahlen (Real- und Imaginärteil sind ∆x, ∆y) und multipliziert die komplexen Zahlen miteinander. Dies stellt sich als ausreichend invariant heraus, um zwischen den Tetrominos zu unterscheiden.
quelle