Avec un entier non signé de 16 bits N , votre tâche consiste à déterminer si sa représentation binaire mappée dans une matrice 4x4 correspond à une forme de tétromino et, dans l'affirmative, de quelle forme il s'agit.
Matrice
Chaque bit de N est cartographié dans une matrice 4x4, de gauche à droite et de haut en bas, en commençant par le plus significatif.
Exemple :
N = 17600
binary representation: 0100010011000000
matrix: [ [ 0, 1, 0, 0 ],
[ 0, 1, 0, 0 ],
[ 1, 1, 0, 0 ],
[ 0, 0, 0, 0 ] ]
Formes de tetromino
Formes de base
Il existe 7 formes de tétrominos, identifiées par les lettres O , I , S , Z , L , J et T :
Rotations et traductions
Si une forme est traduite et / ou pivotée dans la matrice 4x4, elle est toujours considérée comme une variation valide du même tétromino. Par exemple, 17600, 1136, 2272 et 1604 doivent tous être identifiés en tant que J tétrominoes:
Ne pas emballer!
Cependant, les formes ne peuvent pas être enroulées ou déplacées au-delà des limites de la matrice. Par exemple, ni 568 ni 688 ne doivent être identifiés comme des tétrominoes J (sans parler de toute autre forme):
Clarifications et règles
- Vous pouvez entrer les données sous forme d’entier ou directement sous forme de 16 chiffres binaires dans n’importe quel format raisonnable, tel qu’un tableau 2D, un tableau plat ou une chaîne délimitée.
- Il est garanti que l’entrée est un entier non signé de 16 bits (ou sa représentation équivalente sous la forme d’un tableau ou d’une chaîne).
- Lorsqu'une forme valide est identifiée, vous devez imprimer ou renvoyer la lettre d' identification de la forme, en minuscule ou en majuscule.
- Si aucune forme n'est identifiée, vous devez imprimer ou renvoyer une valeur qui ne correspond à aucune lettre de tetromino. Vous pouvez également choisir de ne rien retourner du tout.
- Pour être considérée comme valide, la matrice doit contenir la forme exacte du tétromino sans aucune cellule supplémentaire (voir 1911 et 34953 dans les cas de test).
- C'est du code-golf , donc la réponse la plus courte en octets gagne!
Cas de test
Vous pouvez suivre ce lien pour obtenir les scénarios de test sous forme de tableaux 2D.
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'
la source
func1 . func2 . func3
dans JS: P0
, c'est-1111011110111101111
à- dire pour65535
?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
Réponses:
Gelée ,
54 43 4241 octets-1 octet grâce à Erik l'Outgolfer (déplacer la transposition dans la chaîne répétée)
Un lien monadique prenant un tableau 2D d'entiers (
1
s et0
s) et renvoyant une lettre minusculeoiszljt
pour le tétromino correspondant ouw
s'il est invalide.Essayez-le en ligne! ou voir la suite de tests .
Voir également ce programme qui répertorie tous les 1820 tableaux binaires 2D possibles avec exactement quatre bits définis avec leurs sorties, triés par ces sorties.
Comment?
Cette première prend les quatre rotations de l’entrée. Ensuite, il déplace les bits définis de chaque élément aussi loin que possible vers le bas, puis vers la droite et convertit les résultats en nombres binaires. Il recherche ensuite le résultat minimal dans une liste des représentations minimales de chaque tetromino valide et utilise le résultat décrémenté pour l'indexation dans les deux mots du dictionnaire concaténés
zoist
+jowl
, donnant lieuw
à l'absence de correspondance.Méthode précédente (54 octets)
Un lien monadique prenant un tableau 2D d'entiers (
1
s et0
s) et renvoyant une lettre minusculeoiszljt
pour le tétromino correspondant ouw
s'il est invalide.Essayez-le en ligne!
Ceci vérifie qu’il y a au moins trois lignes vides (lignes + colonnes) et que certains modèles de bits ne sont présents dans aucune ligne (en particulier les nombres 5,9,10,11 et 13). faux positifs. Il aplatit et décale ensuite le nombre binaire (en rayant les zéros à la fin avant la conversion) de chacune des quatre rotations et recherche le résultat minimal dans une liste de nombres, en utilisant le résultat décrémenté pour indexer dans les deux mots du dictionnaire concaténés.
zoist
+jowl
, cédantw
quand aucune correspondance n'a été trouvée.la source
zoistjowl
ne conviendrait pas normalement pour une chaîne sinon: p)...Ṁị“LZOISTJW
toute façon qu'un octet )ZU$3С
: pPython 3 , 124 octets
Essayez-le en ligne!
Attend un entier n représentant une matrice binaire 4 × 4. Lance si aucun tetromino n'est trouvé.
La ligne 2 fait glisser la forme vers la droite jusqu'à ce qu'un 1 se trouve dans la colonne la plus à droite. (4369 est
0001 0001 0001 0001
en binaire.) La ligne 3 abaisse la forme jusqu'à ce qu'un 1 apparaisse dans la rangée du bas. Ensemble cela tourne par exemple:Ensuite, nous cherchons l'index de
n
dans cette liste:Chaque colonne d'indice équivalent modulo 7 correspond à une forme tétromino. 64 (
@
) est utilisé comme valeur de remplissage carn
il ne peut pas être 64 à ce stade du code.NB Une exception est levée pour entrée
0
par informatiquen/n
au lieu de1
.la source
print("ÿ")
, les octets écrits ne le sontc3 bf 0a
pasff 0a
et l'image PPM se transforme en fouillis.APL (Dyalog) ,
9594938987 octets-2 grâce à Zacharý
Nécessite
⎕IO←0
ce qui est la valeur par défaut sur de nombreux systèmes. Prend la matrice booléenne (de n'importe quelle forme!) Comme argument. Ne retourne rien si le nombre donné de bits n'est pas quatre et une ligne vide si les quatre bits donnés ne forment pas un tétromino.Essayez-le en ligne!
Fonctionne en créant les quatre rotations de l’entrée, puis en cherchant chaque tétromino dans chaque rotation.
{
…}
Fonction anonyme où l'argument est représenté par⍵
:,⍵
défaire (aplatir) l'argument+/
résumer4=
est quatre égal à cela?:
si oui, alors (sinon rien ne retourne):⍳4
quatre premières ɩ ndices;[0,1,2,3]
⍵∘{
…}¨
Applique la fonction suivante sur chacun, en utilisant l'entrée comme argument gauche fixe⍺
l'argument de gauche c'est-à-dire l'entrée⊢⍺
céder que (se sépare⍵
de⍺
)⌽∘⍉⍣⍵
miroir et transposition (rotation de 90 °)⍵
fois(
…)∘.⍷
"Produit" extérieur, mais en utilisant Rechercher *, de la liste suivante et des rotations:3↑1
prenez trois éléments d'un, en complétant avec des zéros;[1,0,0]
K←
stocker cela commeK
⍪
table (transforme en vecteur colonne);[[1],[0],[0]]
1,
ajouter un un;[[1,1],[1,0],[1,0]]
("J")J←
stocker commeJ
(
…)⊖¨⊂
Faire tourner tout le J verticalement, chacune des étapes suivantes:⍳3
trois premiers ɩ ntegers;[0,1,2]
nous avons
[[[1,1],[1,0],[1,0]],[[1,0],[1,0],[1,1]],[[1,0],[1,1],[1,0]]]
("J", "L," T ")(
…),
Ajoutez la liste suivante:2⊖J
faire pivoterJ
deux pas verticalement;[[1,0],[1,1],[1,0]]
("T")K⌽
faire pivoter les rangées de celle-ci de 1, 0 et 0 pas respectivement;[[0,1],[1,1],[1,0]]
("Z")0 1⌽¨⊂
faire pivoter tout le tableau verticalement, pas de fois et une fois;[[[0,1],[1,1],[1,0]],[[1,0],[1,1],[0,1]]]
("Z", "S")(
…),
Ajoutez la liste suivante:(2 2)4⍴¨1
remodeler un un en une matrice de 2 × 2 et une liste de 4 éléments;[[[1,1],[1,1]],[1,1,1,1]]
("O", "I")1∊¨
pour chacun, est-ce un membre?∨/
réduction OU horizontale (c.-à-d. entre les rotations; un booléen pour chaque forme)'OIZSLJT'/⍨
l'utiliser pour filtrer la chaîne* Find renvoie un tableau booléen de même forme que son argument de droite, ceux-ci indiquant le coin supérieur gauche de tous les sous-tableaux identiques à l'argument de gauche.
la source
{4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}
JavaScript (ES6),
242212172164 octetsÉtait censé être juste pour lancer le processus, mais je suis un peu en retard pour ça ¯ \ _ (ツ) _ / ¯
Prend une chaîne de bits, avec des lignes séparées par
0
s ('0001000110001000000'
représentant0001 0011 0010 0000
) et retourne un tableau contenant le caractère représentant le tétromino, ou un tableau ne contenant rien.Cela fonctionne en vérifiant chaque rotation de tetromino pour voir si l'entrée en tout point contient le tetromino, entouré entièrement par des zéros de chaque côté. Chaque tetromino est représenté par un ou plusieurs nombres binaires:
Donc, pour vérifier si l’entrée contient un S tetromino, nous vérifions simplement si elle contient la représentation binaire de
51
ou2145
, avec seulement0
s de chaque côté.Quelques-uns des tétrominos ont 4 orientations. Si vous regardez leurs représentations binaires, chacune a 2 représentations qui ne sont que le miroir des deux autres. Pour économiser de l'espace, la représentation binaire est construite en avant et en arrière simultanément à la
C
fonction récursive , ce qui nous permet de ne mettre que deux des orientations et d'impliquer les deux autres.Autre approche avec les codes de caractères:
la source
Retina , 125 octets
Essayez-le en ligne! Link inclut des scénarios de test et un en-tête permettant de convertir des entiers en matrice 4x4. Explication:
Supprimez l'entrée si elle contient 5
1
s.Vérifiez toutes les rotations de l'entrée (voir ci-dessous). Si l’entrée contient quatre secondes consécutives
1
, c’est unI
.S'il contient trois
1
s consécutifs et un a1
sur la ligne suivante sous l'un des trois, mappez le nombre de caractères intermédiaires sur la lettre de résultat appropriée.De la même manière pour deux
1
s adjacents adjacents à deux1
s adjacents sur la ligne suivante.Mais aussi, comptez le nombre de rotations en utilisant les
0
s autrement inutilisés .Et abandonnez si trop de rotations ont été effectuées.
Transposez et inversez le tableau en le faisant pivoter.
la source
MATL , 60 octets
L'entrée est un tableau binaire 4 × 4 (matrice), utilisant
;
comme séparateur de lignes. Ouput est une lettre ou vide pour no tetromino.Essayez-le en ligne! Ou vérifiez tous les cas de test (un point est ajouté en sortie pour permettre d'identifier un résultat vide).
Explication
Le code construit 4 rotations du tableau 4 × 4 en entrée par pas de 90 degrés. Chaque tableau pivoté est complété par 2 zéros de haut en bas, ce qui le transforme en tableau de 8 × 4. Les 4 tableaux sont concaténés verticalement en un tableau 32 × 4. Les quatre tableaux en rotation dans ce tableau concaténé sont "isolés" grâce au remplissage à zéro.
Chacun des 7 modèles possibles est testé pour voir s'il est présent dans le tableau 32 × 4. Une boucle est utilisée pour cela. Chaque motif est défini par deux nombres qui, exprimés en binaire, donnent le masque 0/1 approprié. Par exemple, les chiffres
3
,6
définissent la forme « S ».Les 7 séries de 2 nombres sont disposées dans une matrice 2x7, à partir de laquelle la boucle choisira chaque colonne de manière séquentielle. La matrice est définie en plaçant tous les nombres dans la pile, en les transformant en un vecteur et en les transformant en une matrice à 2 lignes. Étant donné que la forme en "I" est définie par le nombre 15 suivi de 0, sa position à la fin permet de remplir implicitement le 0 par la fonction de remodelage.
Le masque est ensuite complété avec 3 zéros dans les quatre directions. Cela est nécessaire pour détecter les valeurs indésirables dans l'entrée.
Pour voir si le masque est présent dans le tableau 32 × 4, celui-ci est transformé en forme bipolaire (c'est-à-dire −1/1 au lieu de 0/1) et convolué avec le masque. Comme le masque en a 4, la correspondance est obtenue si une entrée du résultat de la convolution est égale à 4.
À la fin de la boucle, 7 résultats faux / vrai ont été obtenus, dont au plus un est vrai. Ceci est utilisé pour indexer une chaîne contenant les lettres de sortie possibles.
la source
Gelée , 53 octets
Essayez-le en ligne!
Programme complet. Prend un 4x4. Imprime
m
s'il ne s'agit pas d'un tétromino, sinon imprime en minuscule.la source
Perl 5 , 197 + 1 (-p) = 198 octets
Essayez-le en ligne!
Prend une chaîne de 16 bits en entrée. N'émet rien si l'entrée n'est pas un seul tétromino.
Comment?
Les deux substitutions "déplacent" la forme de saisie dans le coin inférieur droit. La chaîne de bits résultante est convertie en un entier, puis vérifiée dans un hachage d’entiers valides.
la source
APL (Dyalog) , 66 octets
{'TIOJSLZ-'[(¯51 144 64,,∘+⍨12J96 ¯48J64)⍳×/(+/-4×⊢)⍵/,0j1⊥¨⍳4 4]}
Essayez-le en ligne!
L'arg est un vecteur booléen.
Calcule les distances signées des points par rapport à leur centre de gravité sous forme de nombres complexes (les parties réelles et imaginaires sont x, ∆y) et multiplie les nombres complexes ensemble. Cela s'avère être un invariant suffisant pour distinguer les tétrominoes.
la source