La description
Nous considérons une version légèrement simplifiée de Tetris où chaque mouvement consiste en:
- tourner la pièce dans le sens des aiguilles d'une montre, 0 à 3 fois
- positionner la pièce sur une colonne donnée
- chute rapide
Le but est de déterminer le nombre de lignes terminées, à partir d’une liste de ces déplacements de Tetris.
Les lignes terminées sont supprimées au fur et à mesure que les pièces sont déposées, conformément aux règles standard de Tetris.
Playfield
Le terrain de jeu est large de 10 colonnes. Il n'y a pas de Game Over et on suppose qu'il y a toujours assez d'espace et de temps pour effectuer les actions ci-dessus, quelle que soit la configuration du terrain. La hauteur du champ de jeu n’importe pas vraiment ici, mais vous pouvez utiliser les 22 lignes standard comme limite supérieure.
Formes de tetrominoes
Entrée sortie
Contribution
Une liste de mouvements de Tetris séparés par des virgules, codés avec 3 caractères. Les deux premiers caractères décrivent la forme de Tetromino à utiliser et le dernier décrit la position où il est abandonné.
- Tetromino:
I
,O
,T
,L
,J
,Z
ouS
, dans le même ordre que ci - dessus. - Nombre de rotations dans le sens des aiguilles d'une montre:
0
à3
- Colonne:
0
à9
. C'est la colonne dans laquelle se trouve le coin supérieur gauche de la pièce (marqué d'unx
sur l'image ci-dessus) après la rotation 1
Il est supposé que tous les déplacements dans la liste fournie sont valides. Il n'est pas nécessaire de vérifier les entrées non valides telles que I07
( I
forme horizontale trop éloignée à droite).
1 Vous êtes libre d'implémenter un algorithme de rotation réel ou de coder en dur toutes les formes, tant que le x
est situé dans la colonne indiquée par le troisième caractère du déplacement.
Sortie
Nombre de lignes complétées.
Exemple
O00,T24
générera la première position et O00,T24,S02,T01,L00,Z03,O07,L06,I05
générera la deuxième position.
Par conséquent, la séquence suivante générera un Tetris et devrait renvoyer 4
:
O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19
Cas de test
1) "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19" -> 4
2) "S00,J03,L27,Z16,Z18,I10,T22,I01,I05,O01,L27,O05,S13" -> 5
3) "I01,T30,J18,L15,J37,I01,S15,L07,O03,O03,L00,Z00,T38,T01,S06,L18,L14" -> 4
4) "S14,T00,I13,I06,I05,I19,L20,J26,O07,Z14,Z10,Z12,O01,L27,L04,I03,S07,I01,T25,J23,J27,O01,
I10,I10" -> 8
5) "O00,T24,L32,T16,L04,Z11,O06,L03,I18,J30,L23,Z07,I19,T05,T18,L30,I01,I01,I05,T02" -> 8
Page de test
Vous pouvez utiliser ce JSFiddle pour tester une liste de déplacements.
Réponses:
PHP,
405399378372368360354347331330328319309300 octets(avec la cartographie de bloc de Dave )
programme, prend les mouvements comme arguments séparés, affiche le résultat
panne à fonction:
prend des coups comme tableau, retourne le résultat
pour référence: l'ancienne cartographie
essai
voir mon autre réponse PHP
vouloir regarder?
supprime la
#
source de la fonction et ajoute ceci:quelques marches de golf
Apocalypse 5: Un grand bond en avant (399- 21 = 378) est venu en déplaçant simplement le déplacement de la colonne
d'une boucle séparée pour les deux boucles existantes.
Rév. 8: Passer de la matrice à la base 16 pour la pièce ($ s) ne donnait pas grand chose,
mais laissait la place à un peu plus de golf.
Rév. 17: regroupement des valeurs avec
base64_encode(pack('V*',<values>))
et utilisation de l'indexation d'octets au lieu d'
unpack
enregistrer 16 octetsRév. 25 à 29: inspiré par le code de Dave: nouveau hachage (-2), nouveau design de boucle (-9), goto (-10)
pas de pré-décalage cependant; cela coûterait 17 octets.
plus de potentiel
Avec
/2%9
, je pourrais économiser 15 octets (seulement 14 octets avec/4%5
)en mettant des données binaires dans un fichier
b
, puis en les indexantfile(b)[0]
.Est-ce que je veux ça?
Les caractères UTF-8 coûteraient cher pour la transformation.
sur le hachage
J'ai utilisé
ZJLO.ST /2%9 -> 0123.56
; maisT.ZJLOS /3%7 -> 0.23456
est aussi bon.un octet de plus:
O.STJLZ %13/2 -> 0.23456
et trois autres:
OSTZJ.L %17%12%9 -> 01234.6
Je ne pouvais pas trouver un hachage court (max. 5 octets) qui ne laisse aucun espace;
mais Dave a trouvé
STZJL /4%5 -> 01234
, supprimant le O de la liste. wtg!BTW:
TIJSL.ZO (%12%8) -> 01234.67
salle de feuilles pour laI
forme(et fictive
A
,M
ou laY
forme).%28%8
et%84%8
faites de même (mais avecE
au lieu deA
).la source
break 2
c'est beaucoup plus propre que ce que je devais faire en C! Vous pourrez peut- être économiser des octets en utilisantarray_diff
(définissez les lignes complétées sur une valeur fixe au lieu d’utiliserunset
puis de remplacerarray_values
pararray_diff
), mais je ne saurais dire à partir de la documentation si cela aplatirait les valeurs répétées (par exemple, array_diff ([1,2, 2,3], [1]) -> [2,2,3] ou juste [2,3])array_diff
ne supprime pas les valeurs en double; et j'ai déjà la valeur fixe (1023); mais il ne réindexe pas le tableau. Excellente idée, mais cela coûterait un octet./10
partout), mais sinon je pense que j'ai terminé. Je suis surpris de voir à quel point PHP et C sont compétitifs. C'était amusant - espérons que le PO accepte votre réponse!if
.C,
401392383378374351335324320318316305 octetsPrend une entrée séparée par des virgules sur stdin, renvoie le score dans l'état de sortie.
Nécessite
char
d'être signé (ce qui est le comportement par défaut pour GCC) et doit'3Z3Z'
être interprété comme 861549402 (ce qui est le cas pour GCC sur les machines little endian).Exemple d'utilisation:
Explication de haut niveau:
Toutes les formes, à l'exception de la ligne, peuvent s'inscrire dans une grille 3x3 avec un coin manquant:
Cela signifie qu'il est facile de les stocker dans un octet chacun. Par exemple:
(nous alignons chaque morceau sur le coin inférieur gauche de la boîte pour le déposer plus facilement)
Étant donné que nous obtenons au moins 4 octets pour un int, cela signifie que nous pouvons stocker les 4 rotations de chaque pièce dans un seul entier, avec un cas spécial pour la ligne. Nous pouvons également adapter chaque ligne de la grille de jeu à un int (il ne faut que 10 bits), et à la pièce en chute longue (4 lignes = 40 bits).
Panne:
-4, -1 grâce à @Titus et -23, -11 inspirés par leur réponse
la source
s+=(d[A-x]=d[A])
sans utiliserx
?x
est malheureusement nécessaire de garder trace du nombre de lignes à réduire dans l'étape en cours (chaque ligneA
est définie sur la valeur de la ligne àA-x
mesure que la boucle progresse)1[a]
eta[1]
faire la même chose (ou plus précisément, sea[b]
traduit par*(a+b)
). C'est abusé comme ça pour éviter les parenthèses. Dans ce cas,1[*v]
==(*v)[1]
, c'est-à-dire la deuxième lettre de la commande, c'est-à-dire la rotation.I
espace réservé? Si c'est le cas, essayez/2%9
comme hash au lieu de%12
.%12%8
si non.Ruby,
474443428379 + 48 = 427 octets-1 grâce à @Titus
Cela peut certainement être joué au golf plus.
Lit un dictionnaire binaire de morceaux (voir ci-dessous) à partir de STDIN ou d'un nom de fichier et prend une liste de déplacements en argument, par exemple
$ cat pieces | ruby script.rb O00,T24,S02,...
.Données de morceaux binaires (format xxd)
Voir sur repl.it (avec les arguments codés en dur, dictionnaire): https://repl.it/Cqft/2
Ungolfed & explication
la source
m >> 10
pourrait êtrem >> x
\d
s dans l'expression régulière:/(\w)(\d)(\d)/
→/(\w)(.)(.)/
PHP,
454435427420414 octetschamps de bits pour les morceaux et la carte; mais pas de cas particulier pour la
I
forme comme le golf de Dave.prend les arguments de la ligne de commande, affiche le résultat
non golfé comme fonction
prend les arguments en tant que tableau, retourne le résultat
tests (sur la fonction)
la source
<?
frais généraux :)