Descripción
Consideramos una versión ligeramente simplificada de Tetris donde cada movimiento consiste en:
- girando la pieza en sentido horario, 0 a 3 veces
- posicionar la pieza en una columna dada
- caída rápida
El objetivo es determinar el número de líneas completadas, dada una lista de tales movimientos de Tetris.
Las filas completas se eliminan a medida que se sueltan las piezas, siguiendo las reglas estándar de Tetris.
Campo de juego
El campo de juego tiene 10 columnas de ancho. No hay Game Over y se supone que siempre hay suficiente espacio y tiempo para realizar las acciones anteriores, sin importar la configuración del campo de juego. La altura del campo de juego realmente no importa aquí, pero puede usar las 22 filas estándar como límite superior.
Formas de tetrominoes
De entrada y salida
Entrada
Una lista separada por comas de movimientos de Tetris codificados con 3 caracteres. Los dos primeros caracteres describen la forma de Tetromino que se utilizará y el último describe la posición donde se dejó caer.
- Tetromino:
I
,O
,T
,L
,J
,Z
oS
, en el mismo orden que anteriormente. - Número de rotaciones en sentido horario:
0
a3
- Columna:
0
a9
. Esta es la columna en la que se encuentra la esquina superior izquierda de la pieza (marcada con unx
en la imagen de arriba) después de la rotación 1
Se supone que todos los movimientos en la lista proporcionada son válidos. No es necesario verificar las entradas no válidas, como I07
( I
forma horizontal colocada demasiado a la derecha).
1 Usted es libre de implementar un algoritmo de rotación real o de codificar todas las formas diferentes, siempre que x
esté ubicado en la columna dada por el tercer carácter del movimiento.
Salida
Número de líneas completadas.
Ejemplo
O00,T24
generará la primera posición y O00,T24,S02,T01,L00,Z03,O07,L06,I05
generará la segunda posición.
Por lo tanto, la siguiente secuencia generará un Tetris y debería regresar 4
:
O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19
Casos de prueba
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
Página de prueba
Puede usar este JSFiddle para probar una lista de movimientos.
Respuestas:
PHP,
405399378372368360354347331330328319309300 bytes(con el mapeo de bloques de Dave )
programa, realiza movimientos como argumentos separados, imprime el resultado
desglose para funcionar:
toma movimientos como matriz, devuelve el resultado
para referencia: el viejo mapeo
pruebas
ver mi otra respuesta PHP
¿quiero ver?
elimine la
#
fuente de la función y agregue esto:algunos pasos de golf
Rev. 5: Un salto grande (399- 21 = 378) fue simplemente moviendo el cambio de columna
de un circuito separado para los dos bucles existentes.
Rev. 8: Cambiar de la matriz a la base 16 para la pieza ($ s) no dio mucho,
pero dio paso a un poco más de golf.
Rev. 17: analizó los valores
base64_encode(pack('V*',<values>))
y utilizó la indexación de bytes en lugar de
unpack
guardar 16 bytesRev. 25 a 29: inspirado en el código de Dave: nuevo hashing (-2), nuevo diseño de bucle (-9), goto (-10)
sin cambio previo; eso costaría 17 bytes.
más potencial
Con
/2%9
, podría guardar 15 bytes (solo 14 bytes con/4%5
)colocando datos binarios en un archivo
b
y luego indexandofile(b)[0]
.¿Quiero eso?
Los caracteres UTF-8 costarían mucho para la transformación.
en el hash
Solía
ZJLO.ST /2%9 -> 0123.56
; PeroT.ZJLOS /3%7 -> 0.23456
es tan bueno.un byte más largo
O.STJLZ %13/2 -> 0.23456
y tres más:
OSTZJ.L %17%12%9 -> 01234.6
No pude encontrar un hash corto (máx. 5 bytes) que no deja espacio;
pero Dave encontró
STZJL /4%5 -> 01234
, dejando caer el O de la lista. wtg!BTW:
TIJSL.ZO (%12%8) -> 01234.67
deja espacio para laI
forma(y un ficticio
A
,M
oY
forma).%28%8
y%84%8
, haga lo mismo (pero con enE
lugar deA
).fuente
break 2
es mucho más limpia de lo que tenía que hacer en C! Es posible que pueda guardar algunos bytes usandoarray_diff
(establezca las líneas completas en un valor fijo en lugar de usar yunset
luego reemplacearray_values
conarray_diff
), pero no puedo decir por los documentos si eso aplanaría los valores repetidos (por ejemplo, array_diff ([1,2, 2,3], [1]) -> [2,2,3] o simplemente [2,3])array_diff
no elimina valores duplicados; y ya tengo el valor fijo (1023); pero no reindexa la matriz. Gran idea, pero costaría un byte./10
todas partes), pero de lo contrario creo que he terminado. Estoy sorprendido de lo directamente que resultaron ser PHP y C competitivos. Esto fue divertido, ¡espero que el OP acepte tu respuesta!if
.C,
401392383378374351335324320318316305 bytesToma una entrada separada por comas en stdin, devuelve la puntuación en el estado de salida.
Requiere
char
estar firmado (que es el valor predeterminado para GCC) y'3Z3Z'
debe interpretarse como 861549402 (que es el caso para GCC en máquinas little endian, al menos).Ejemplo de uso:
Explicación de alto nivel:
Todas las formas, excepto la línea, pueden caber en una cuadrícula de 3x3 sin una esquina:
Eso significa que es fácil almacenarlos en un byte cada uno. Por ejemplo:
(alineamos cada pieza en la parte inferior izquierda de la caja para que sea más fácil soltarla)
Como obtenemos al menos 4 bytes por int, esto significa que podemos almacenar las 4 rotaciones de cada pieza en un solo entero, con un caso especial para la línea. También podemos ajustar cada fila de la cuadrícula del juego en un int (solo necesita 10 bits), y la pieza que cae actualmente en un largo (4 líneas = 40 bits).
Descompostura:
-4, -1 gracias a @Titus, y -23, -11 con inspiración de su respuesta
fuente
s+=(d[A-x]=d[A])
sin usarx
?x
es necesario realizar un seguimiento de cuántas filas colapsar en el paso actual (cada filaA
se establece en el valor de la fila aA-x
medida que avanza el bucle)1[a]
ya[1]
hacer lo mismo (o más precisamente, sea[b]
traduce en*(a+b)
). Se abusa de esta manera como una forma de evitar los corchetes. En este caso,1[*v]
==(*v)[1]
, es decir, la segunda letra del comando, es decir, la rotación.I
marcador de posición? Si es así, intente/2%9
como hash en lugar de%12
.%12%8
si no.Ruby,
474443428379 + 48 = 427 bytes-1 gracias a @Titus
Esto definitivamente se puede jugar más al golf.
Lee un diccionario binario de piezas (ver más abajo) de STDIN o un nombre de archivo y toma una lista de movimientos como argumento, por ejemplo
$ cat pieces | ruby script.rb O00,T24,S02,...
.Datos de piezas binarias (formato xxd)
Véalo en repl.it (con argumentos codificados, diccionario): https://repl.it/Cqft/2
Sin golfos y explicación
fuente
m >> 10
podría serm >> x
\d
s en la expresión regular:/(\w)(\d)(\d)/
→/(\w)(.)(.)/
PHP,
454435427420414 bytescampos de bits para piezas y mapa; pero no hay un caso especial para la
I
forma como el golf de Dave.toma argumentos de la línea de comando, imprime el resultado
no golfed como función
toma argumentos como matriz, devuelve el resultado
pruebas (en función)
fuente
<?
gastos generales :)