Cuando a los estudiantes se les enseña por primera vez sobre la técnica de prueba de inducción matemática , un ejemplo común es el problema de colocar una rejilla de 2 N × 2 N con trominos en forma de L , dejando un espacio de rejilla predeterminado vacío. (N es un número entero no negativo).
Te dejaré que revises la prueba si aún no lo sabes. Hay muchos recursos que lo discuten.
Su tarea aquí es escribir un programa que tome un valor para N, así como las coordenadas del espacio de la cuadrícula para dejarlas vacías, e imprima una representación ASCII de la cuadrícula de mosaicos de tromino resultante.
El personaje O
llenará el espacio vacío, y las 4 rotaciones de nuestro tromino se verán así:
|
+-
|
-+
-+
|
+-
|
(Sí, puede ser ambiguo cuál +
va con qué -
y |
para ciertos arreglos, pero está bien).
Su programa debe funcionar para N = 0 (para una cuadrícula de 1 × 1) hasta al menos N = 8 (para una cuadrícula de 256 × 256). Se le darán valores x e y que son las coordenadas para O
:
- x es el eje horizontal. x = 1 es el borde izquierdo de la cuadrícula, x = 2 N es el borde derecho de la cuadrícula.
- y es el eje vertical. y = 1 es el borde superior de la cuadrícula, y = 2 N es el borde inferior de la cuadrícula.
Tanto x como y siempre están en el rango [1, 2 N ].
Entonces, para un determinado N, x e y, su programa debe imprimir una cuadrícula de 2 N × 2 N , completamente en mosaico con trominoes en forma de L, excepto por la coordenada de la cuadrícula x, y que será un O
.
Ejemplos
Si N = 0, entonces x e y deben ser ambos 1. La salida es simplemente
O
Si N = 1, x = 1 ey = 2, la salida sería
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (por ejemplo, la imagen en esta página ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Detalles
- Puede escribir una función que tome los 3 enteros en lugar de escribir un programa completo. Debe imprimir o devolver la cadena de la cuadrícula.
- Tome la entrada de stdin, línea de comando, (o args de función si escribe función).
- La salida puede contener opcionalmente una línea de entrenamiento única.
- No es necesario que utilice el método de mosaico que normalmente sugiere la prueba. Solo importa que la cuadrícula esté llena de trominoes en forma de L además del
O
. (Los trominos no se pueden cortar ni salir de los límites de la cuadrícula).
El código más corto en bytes gana. Tiebreaker es una publicación anterior. ( Práctico contador de bytes ) .
if p!=i
; la lista dentro.join()
no necesita[]
;(1-i%2)
se puede hacer como~i%2
; puede usar el desempaquetado iterable para escribirt,l,a=[],...
como*t,l,a=...
;if n==0
puede verificarse comoif n<1
porquen
no puede ser negativo; la final"\n".join
probablemente se puede hacer imprimiendo cada elemento, ya que las reglas generales permiten imprimir en lugar de regresar;if p!=i
puede serif p-i
porque los valores distintos de cero son Verdad.f
es una función recursiva. De hecho, tengo que revertir el formato de salida consplit()
cada auto llamada.A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D)))
,t+=[...]
en la penúltima línea se puede escribir comot+=...,
(agregando una tupla en lugar de una lista) y no estoy seguro de si funciona, peroA if B else C
se puede escribir comoB and A or C
(también en el penúltima línea), pero solo si A nunca es falso (¿qué no creo que sea?)JavaScript (ES6) 317
414Mucho trabajo para jugar al golf, pero aún bastante largo.
Ejecute el fragmento para probar (mejor aspecto usando caracteres de bloque Unicode, pero incluso un poco más)
Mostrar fragmento de código
fuente
IDL 8.3+, 293 bytes
Esto es demasiado largo, estoy tratando de reducirlo, pero aún no he llegado allí.
Salidas:
Y, eh ... solo por diversión ...
fuente
Ruby Rev 1, 288
Como un literal lambda anónimo. Se muestra en el programa de prueba (el literal lambda es
->(n,a,b){...}
)Ruby Rev 0, 330 sin golf
Actualmente, el único juego de golf que reclamo es la eliminación de comentarios, nuevas líneas innecesarias y sangrías.
Este es mi primer algoritmo apropiado codificado en Ruby y ha sido un trabajo duro. Estoy seguro de que hay al menos 50 caracteres que pueden eliminarse, pero he hecho lo suficiente por ahora. Hay algunos horrores reales, por ejemplo, la entrada. Eso probablemente se puede solucionar mediante una función o lambda en lugar de un programa, pero la función interna
t
que dibuja los trominoes aún necesita acceso a las variables globales. Tendré que averiguar la sintaxis para eso.Una característica de mi respuesta que no está presente en los demás es que inicializo una serie de cadenas con
|
caracteres. Eso significa que solo tengo que dibujar el+-
o-+
, que están uno al lado del otro en la misma línea.fuente
Haskell, 170 bytes
Corre en línea en Ideone
Ejemplo de ejecución:
fuente