Me gusta mucho el Tetris, pero no soy muy bueno en eso. ¡Solo una vez me gustaría ver esa nave espacial despegar frente a mis propios ojos! Y dado que las computadoras son tan buenas en todo, la única solución posible es hacer un programa para que lo reproduzca por mí ... ¡excepto que vas a hacer eso por mí!
Dado un tetromino (forma hecha de cuatro cuadrados) y un mapa del campo de juego, debe colocar el tetromino de modo que obtenga el mayor número de líneas (hace que el mayor número de filas esté completamente lleno de bloques) y cree el menor número de nuevos agujeros (un espacio vacío que no puede "ver" la parte superior del campo de juego 1 ).
Entrada
La entrada contendrá un carácter en una sola línea que representa el tetromino que cae, seguido de una cuadrícula 10 * 18 2 de espacios ( ) y signos más (
+
).
El personaje representa cualquiera de los siete tetrominoes básicos encontrados en Tetris. Todas las piezas se pueden girar 90 grados, pero no se pueden voltear. Todos los tetrominoes y sus rotaciones son los siguientes:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
La cuadrícula representa el campo de juego de Tetris, con +
bloques previamente colocados. Entonces, una entrada de ejemplo podría ser la siguiente:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Salida
Su salida será idéntica a la entrada, pero con el tetromino en la posición ideal. El tetromino debe representarse con #
para diferenciarlos de los bloques colocados previamente. Además de esto, también debe mostrar cuántas líneas / agujeros crea su ubicación en el formulario xL yH
en una nueva línea.
El resultado para el ejemplo dado anteriormente sería el siguiente 3 :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Debe generar solo los mejores resultados; en el caso de que dos o más casos den la misma puntuación, debe generarlos todos (separados por una línea en blanco). Los mejores resultados se determinarán ordenando primero el número de líneas marcadas (descendentes) y luego el número de nuevos agujeros creados (ascendentes). Entonces, 1L 1H
es un mejor puntaje que 0L 0H
.
Trabajaré para crear una lista de varias entradas y salidas esperadas con las que pueda probar su programa. Mira este espacio.
Reglas y Desambiguación
- Este es el código de golf , por lo que gana la implementación correcta más corta.
- La entrada / salida puede estar en cualquier medio que se adapte a su idioma de destino (por ejemplo, archivo, stdin / stdout, área de texto).
- Si su idioma de destino no admite la entrada de varias líneas (o no es conveniente hacerlo), puede delimitar cada línea de la entrada con comas (
,
). - Puede omitir la salida de cualquier línea en blanco en la cuadrícula.
- Recuerde que el tetromino cae desde arriba, no puede colocar la pieza "bajo tierra". Por lo tanto, puede suponer que todas las ubicaciones posibles de la pieza estarán en "nivel de superficie" (es decir, no hay bloques entre la pieza y la parte superior del tablero).
- Suponga que nunca habrá una situación en la que se vea obligado a terminar un juego (el tetromino colocado toca el centro superior del campo).
- Las soluciones que son idénticas en la salida deben omitirse (por ejemplo, hay 3 salidas de soluciones si gira ingenuamente la
O
pieza).
1 Soy consciente de que esto creará algunos falsos positivos, pero es una simplificación.
2 Este es el tamaño de cuadrícula utilizado en la versión de Game Boy.
3 Sí, 0H
es correcto. Comprueba de nuevo, dije nuevos agujeros; ^)
Respuestas:
C 1009 bytes
Aquí está la versión sin golf
Vi que la fuente principal de código largo probablemente sería la definición de los mosaicos. Así que decidí representarlos como patrones de bits en una matriz de 4x4 bits. Esto da como resultado 16 bits que caben fácilmente en un solo
int
. Latiles
matriz contiene todos los patrones para las 19 rotaciones posibles de los 7 mosaicos.Al compilar, ignore la advertencia que
gets
está en desuso. Sé que es, pero es la forma más corta de leer una línea desde la entrada.fuente
int
como se supone. Varios de susprintfs
únicos producen un solo carácter. Es posible que pueda reemplazarlos con un equivalenteputchar
para guardar un par de caracteres. Por ejemplo, cambiarprintf("\n")
aputchar(10)
:)