Representemos un ladrillo de mampostería estándar como [__]
(e ignoremos el hecho de que la parte superior está abierta). Cuando se apilan estos ladrillos, cada otra capa se compensa con medio ladrillo, como es habitual en la construcción de ladrillos:
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
Por lo tanto, cada ladrillo tiene como máximo seis vecinos y es imposible que dos ladrillos se alineen directamente verticalmente.
El punto clave es que los arreglos de estos ladrillos no se mueven , sino que simplemente se mantienen unidos por gravedad. Por lo tanto, es importante que cada ladrillo en la estructura sea estable, de lo contrario, toda la estructura es inestable.
Hay tres formas en que un ladrillo individual puede ser estable:
- Cualquier ladrillo en el suelo (la línea más baja de ladrillos) es estable.
Cualquier ladrillo que tenga dos ladrillos directamente debajo es estable:
[__] <- this brick is stable [__][__] <- because these bricks hold it up
Cualquier ladrillo que tenga un ladrillo encima y debajo del mismo lado es estable:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
De estas reglas podemos ver, por ejemplo, la disposición
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
es inestable porque el ladrillo superior derecho es inestable, que es todo lo que se necesita.
Una estructura de ladrillos solo es estable si todos sus ladrillos son estables.
Reto
Su tarea es escribir una función que tome una cadena de estructura de ladrillo y devuelva un valor verdadero si la estructura es estable, y un valor falso si es inestable. ( verdad / falsa definición )
La cadena de entrada puede ser arbitrariamente grande, pero siempre será una cuadrícula rectangular de caracteres, con espacios que llenan áreas sin ladrillos. El ancho de la cuadrícula de caracteres será divisible por 4, pero la altura puede ser impar o par.
La cuadrícula de ladrillo siempre se extiende por encima y a la derecha de la posición inferior izquierda del ladrillo:
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
Dependiendo de la estructura, cada BRK?
uno representa un ladrillo ( [__]
) o un espacio vacío (4 espacios).
Observe que las cavidades de medio ladrillo se rellenan con espacios para garantizar que la cuadrícula de caracteres sea rectangular.
Tanteo
El código más corto en bytes gana.
Notas
- Si lo desea, puede usar
.
lugar de espacio como el carácter de espacio vacío. - La cadena vacía se considera estable.
- Si su idioma no tiene funciones, puede usar una variable de cadena con nombre como entrada y asignar el resultado a otra variable.
- Si su idioma no tiene cadenas, puede hacer lo que parezca apropiado para la entrada.
Casos de prueba
Varios casos de prueba, separados por líneas vacías. Para mayor claridad .
se utiliza en lugar de espacio para espacios vacíos.
Estable:
[__]
..[__]..
[__][__]
........[__]........
......[__][__]......
........[__]........
..[__][__]..
[__][__][__]
..[__][__]..
[__]....[__]
............[__]..
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
..[__]........[__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
Inestable:
..[__]..
........
..[__]..
[__]....
..[__]..
....[__]
..[__][__]..
[__]....[__]
..[__][__]..
[__]....[__]
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
........[__]....
......[__][__]..
....[__][__]....
..[__][__]......
[__][__]........
..[__]..........
(tendrá que apilar mentalmente esas líneas una encima de la otra. El punto es que sus reglas permiten estructuras cuyo centro de gravedad está muy alejado de su punto de contacto con el suelo. Debería ser posible apretarlas para evitar esto , sin necesidad de un motor de física, si te apetece.)Respuestas:
80386 código máquina, 98
El código:
El código escanea el arte ASCII desde el final hasta el principio, saltando 2 caracteres a la vez. Esto hace el doble de las comprobaciones necesarias (sería suficiente para saltar 4 caracteres), pero simplifica la lógica.
La verificación comienza en la penúltima fila de caracteres (no es necesario verificar la última línea). En cada línea, comienza 3 caracteres desde la derecha (no es necesario verificar demasiado a la derecha). Para cada personaje, verifica 4 personajes circundantes:
Hay un montón de condiciones lógicas para verificar:
Es una coincidencia afortunada que todos los personajes de ladrillo
[_]
tengan su conjunto LSB; todos los demás personajes lo.\n
tienen claro. Además, el conjunto de instrucciones 80386 tiene estos prácticos registros "alto" y "bajo" (ah
,al
, etc), lo que ayuda paralelizar los controles un poco. Entonces, todas las cuentas de cheques equivalen a un poco de violín oscuro.Empecé con el siguiente código C:
Traduje el código al lenguaje ensamblador (es principalmente uno a uno), incluida una implementación de golf
strchr
ystrlen
. El siguiente código fuente es traducido por MS Visual Studio al código de máquina en la parte superior de mi publicación.fuente
MATLAB - 119 bytes
Minified:
Expandido:
Uso de muestra:
Detalles
La rutina agrega una fila
.
a la parte superior de la matriz de entrada, luego se convierte en una matriz numérica agregando 3 a los códigos de caracteres ASCII. Dada esta conversión, una convolución 2D con el núcleoproduce una matriz
0
en ubicaciones donde el patrón de caracteresestá presente, con la
*
representación de "cualquier personaje". Debido a la construcción del núcleo, este es el único patrón de caracteres válido que producirá a0
.Se realiza una convolución idéntica con la versión volteada izquierda-derecha del núcleo para detectar
Una entrada es estable si i ) está vacía o ii ) no aparecen ceros en ninguna de las convoluciones.
Dos frustraciones son
La convolución predeterminada de MATLAB pasa los bordes de la matriz de operandos, produciendo
0
s erróneos en las esquinas opuestas para ambas convoluciones, lo que requiere,'valid'
que se agreguen (8 bytes) a laconv2
llamada para limitar la salida al área donde la convolución es válida.El manejo de la caja de cadena vacía agrega 12 bytes.
fuente
JavaScript (E6) 131
261Prueba en la consola FireFox / FireBug
Salida
Sin golf
fuente
[...a]
, si no te importa que te pregunte? Sé que ES6 permite...arg
como último argumento de una función capturar variables, pero nunca he visto que se use de esta manera.{:}
en MATLAB. Eso va a ser muy útil. Gracias. :)Python 279
Creo que soy bastante malo en los desafíos de golf de código y tal vez uso los idiomas incorrectos para eso: D Pero me encanta el código que se puede leer fácilmente :) Por cierto, ¡me gustaría ver un código de Python que use menos bytes!
Posibles ejemplos:
fuente
_
y[
<>
, usaría!=
.!=
es la forma preferidaJavaScript 2 (ES6) -
148151bytesEspera una cadena de filas de ladrillo separadas por una nueva línea (nota: si pudiéramos usar un carácter separador diferente como "|" para separar las filas, esto podría hacerse 1 byte más corto).
Prueba en la consola de Firefox con:
fuente
Pitón, 209
Pruebas:
Salida:
fuente