Introducción
En este desafío, una matriz 2 × 2 se indexa así:
0 1
2 3
Definimos una familia de patrones fractales F(L)
, donde L
hay una n
lista de longitud de estos índices y F(L)
tiene tamaño .2n-1 × 2n-1
- Si
L == []
, entoncesF(L)
es el patrón 1 × 1#
. Si
L != []
, entoncesF(L)
se construye de la siguiente manera. DejeP
ser el patrón obtenido deL
con el primer elemento eliminado. Tome cuatro cuadrículas de tamaño llenas de puntos y reemplace la cuadrícula indexada con el patrón . Luego, pegue las rejillas juntas usando una capa de hashes entre ellas. Aquí hay diagramas para los cuatro casos:2n-1-1 × 2n-1-1
.
L[0]
P
#
L[0]==0 L[0]==1 L[0]==2 L[0]==3 #... ...# ...#... ...#... [P]#... ...#[P] ...#... ...#... #... ...# ...#... ...#... ####### ####### ####### ####### ...#... ...#... #... ...# ...#... ...#... [P]#... ...#[P] ...#... ...#... #... ...#
Ejemplo
Considere la entrada L = [2,0]
. Comenzamos con la cuadrícula 1 × 1 #
, y atravesamos L
desde la derecha. El elemento más a la derecha es 0
, por lo que tomamos cuatro copias de la cuadrícula 1 × 1 .
, reemplazamos la primera por #
y las pegamos con hashes. Esto da como resultado la cuadrícula 3 × 3
##.
###
.#.
El siguiente elemento es 2
, entonces tomamos cuatro copias de la cuadrícula de 3 × 3 de .
s, y reemplazamos la tercera con la cuadrícula anterior. Las cuatro cuadrículas son
... ... ##. ...
... ... ### ...
... ... .#. ...
y pegarlos junto con #
s resulta en la cuadrícula 7 × 7
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
Este es nuestro resultado final.
Entrada
Su entrada es una lista L
de los índices 0, 1, 2, 3
. Puede tomarlo como una lista de enteros o una cadena de dígitos. Tenga en cuenta que puede estar vacío y puede contener duplicados. El largo deL
es como máximo 5.
Salida
Tu salida es el patrón F(L)
como una cadena delimitada por nueva línea.
Reglas y puntaje
Puede escribir un programa completo o una función. gana el conteo de bytes más bajo y no se permiten las lagunas estándar.
Casos de prueba
[]
#
[0]
##.
###
.#.
[3]
.#.
###
.##
[2,0]
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
[1,1]
...#.##
...####
...#.#.
#######
...#...
...#...
...#...
[1,2,0]
.......#...#...
.......#...#...
.......#...#...
.......########
.......###.#...
.......#####...
.......#.#.#...
###############
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
[3,3,1]
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
###############
.......#...#...
.......#...#...
.......#...#...
.......########
.......#...#.##
.......#...####
.......#...#.#.
[0,1,2,3]
.......#...#...#...............
.......#...#...#...............
.......#...#...#...............
.......#########...............
.......#.#.#...#...............
.......#####...#...............
.......#.###...#...............
################...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
###############################
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
[0,0,1,2,3]
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#########...............#...............................
.......#.#.#...#...............#...............................
.......#####...#...............#...............................
.......#.###...#...............#...............................
################...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
################################...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
###############################################################
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
#
?L !=[]
en ese ejemplo, ya que tiene 1 o más elementos. ¿Significa esto que F (L) siempre es un#
al principio?L = [2,0]
, corta la cabeza y mira el patrónF([0])
, luego corta la cabeza[0]
y mira el patrónF([])
, que es la cuadrícula 1x1#
. Luego, usa el índice cortado0
en él para construir el patrón 3x3, y usa el índice cortado2
en ese para construir el patrón 7x7. Para responder a su pregunta: sí, siempre comienza con la cuadrícula 1x1 ya que ese es el caso base de la recursividad.Respuestas:
CJam,
5947434140 bytesGracias a Sp3000 por guardar 1 byte.
Pruébalo aquí.
Explicación
Ligeramente anticuado. Se arreglará más tarde.
Todos los reordenamientos de dimensiones de las listas 4D me están mareando ...
Este código implementa la especificación muy literalmente, usando el algoritmo iterativo de la sección de ejemplo en lugar de su definición recursiva. Un truco de golf importante es que estoy usando espacios en lugar de
#
durante el cálculo y solo los reemplazo con#
al final, lo que simplifica el código en un lugar y me permite usarlo enS
lugar de'#
o"#"
en varios.fuente
MATL ,
4241 bytesPruébalo en línea!
Explicación
Esto funciona iterativamente usando un producto Kronecker para extender la matriz en cada iteración. La matriz está construida con
0
y en1
lugar de.
y#
, y al final se reemplazan por los caracteres apropiados.Habrá tantas iteraciones como el tamaño de entrada. La entrada se procesa de derecha a izquierda. El índice de iteración comienza en
1
.Usando el ejemplo en el desafío, con entrada
[2,0]
, la matriz se inicializa comoEsto corresponde al inicial
1
(#
) extendido por una fila y una columna, cuyo propósito se aclarará más adelante. Los valores en esas columnas no son importantes, ya que se sobrescribirán; igualmente podrían ser unos:En cada iteración, la matriz existente se multiplica por Kronecker por una matriz 2 × 2 cero-uno que contiene
1
en la posición indicada por la entrada actual de la entrada y0
en las otras entradas. En el ejemplo en la iteración i = 1, dado que la entrada de entrada más a la derecha es0
, la matriz cero-uno esy el producto Kronecker de estas dos matrices es
A continuación, la fila y la columna con el índice
2^i
se completan con unos:Las primeras tres filas y columnas constituyen el resultado de la primera iteración. Como antes, hay una fila y una columna adicionales, que son útiles para extender la matriz en la próxima iteración.
En la iteración i = 2, dado que el valor de entrada actual contiene
2
la matriz anterior, Kronecker se multiplica porlo que da
Llenar la
2^i
fila y la columna número con unidades daComo esta es la última iteración, se eliminan la fila y la columna adicionales:
y la sustitución de caracteres se realiza para producir el resultado final:
La descripción detallada del código sigue:
fuente
Haskell,
123122bytesEjemplo de uso:
Cómo funciona:
fuente
JavaScript (ES6),
171152 bytesToma el resultado de la llamada recursiva, luego reemplaza cada línea por sí misma más un hash más una cadena de puntos de la misma longitud, en orden inverso si es necesario, luego a partir de ese resultado parcial crea una cadena de puntos a excepción de las líneas nuevas y la columna central de hashes, y también una cadena de hashes con líneas nuevas circundantes, luego une esas tres cadenas en el orden apropiado.
fuente
Rubí,
143134 bytesUna función anónima.
1 byte guardado por una reorganización de la primera línea. Se guardan 6 bytes cambiando la forma en que se incrementa z de una fórmula a una tabla. 2 bytes guardados eliminando varable
w
.Sin golf en el programa de prueba
fuente
Ruby, 150 bytes
Función anónima. Utiliza una llamada recursiva para crear una lista de cadenas, una cadena por línea, luego las une todas al final.
fuente
Python 3.5, 1151 bytes:
No es un gran código de golf, pero bueno. Intentaré podarlo más con el tiempo donde pueda.
Una manera bastante ingenua de hacer esto, pero, sin embargo, actualmente funciona perfectamente y, como puede ver, no utiliza módulos / bibliotecas externas. Además, se puede tomar en forma de más de 5 artículos de la lista proporcionada
s
sin perder precisión (es decir, si el hardware puede manejarlo). Cumple todos los requisitos, y no podría estar más feliz con lo que obtuve. :)¡Ahora también puede no solo aceptar cualquier número dentro del rango
0=>3
como cualquiera de los valores, sino también cualquier número , punto, gracias al&
operador bit a bit! Puedes leer más sobre ellos aquí . Ahora, por ejemplo,[4,4,1,2,3]
ya que la lista de entrada es la misma que[0,0,1,2,3]
.Nota: la entrada debe proporcionarse como una lista
Sin disculpas con la explicación:
Explicación más amplia y mucho más atractiva visualmente:
Para una explicación más amplia y visualmente más atractiva, considere la segunda vez que pasa por el bucle "principal" en el código anterior, en el que se encuentra la lista de entrada
[0,2]
. En este caso, los elementos en la lista "principal"l
serían:y
y la lista
y
solo contendría0
. Aprovechando la forma en que Python indexa el último elemento de la cuadrículal[-1]
, podemos etiquetar los elementos muy a la izquierda de la cuadrícula de la siguiente manera:¿Qué patrón ves? Cada índice a la izquierda de la cuadrícula es un múltiplo de 8, y dado que, usando la ecuación, se
2^(n-1)-1
obtiene la longitud de cada segmento de puntos en la cuadrícula, podemos hacer((2^(n-1)-1)*2)+2
para encontrar la longitud del borde superior de la cuadrícula como un todo (+2 para incluir el medio#
sy\n
el final). Podemos usar esa ecuación, que llamaremosi
para encontrar los valores de índice de cada elemento en el lado izquierdo de una cuadrícula de cualquier tamaño creando una lista y agregando a la lista todos los enteros, que llamaremos_
, en el rango0=>length of grid l[-1]
, tal que ese elemento sea un múltiplo dei
, Y también tal que_
NO sea iguali*(2^(n-1)-1)
, de modo que podamos excluir el segmento medio de#
s separando la mitad superior de la mitad inferior. Pero queremos TODOS los elementos de puntos de la izquierda, y no solo los elementos del lado izquierdo. Bueno, hay una solución para eso, y eso sería simplemente agregar a la lista una lista que contienei+h
donde h es cada número entero en el rango0=>2^(n-1)
cada vez que0=>length of grid l[-1]
se agrega un valor del rango a la lista, de modo que cada vez, habrá tantos números de valores agregados a la lista como la longitud de un cuadrante de puntos. Y esa es la listaa
.Pero ahora, ¿qué tal los puntos en la mitad derecha? Bueno, veamos la indexación de una manera diferente:
Como puede ver, los valores ahora en el medio son los que necesitamos, ya que son el comienzo del índice de cada segmento de puntos en el lado derecho de la cuadrícula. Ahora, ¿cuál es el patrón aquí? Bueno, si aún no es lo suficientemente obvio, ¡ahora los valores medios son múltiplos de
i/2
! Con esa información, ahora podemos crear otra lista,b
a la quei/2
se agregan los múltiplos de desde el rango de0=>length of grid l[-1]
manera que cada entero de ese rango, al que llamaremos nuevamente_
, NO sea igual(i/2)*(p*2)
a excluir la línea de#
s que separa la parte superior y mitades inferiores, Y tal que _ NO ya está en la lista a, ya que realmente no necesitamos 8,16,32, etc. en listab
. Y ahora, nuevamente, no solo queremos esos índices específicos. Queremos TODOS los caracteres de punto en el lado derecho de la cuadrícula. Bueno, al igual que lo hicimos en la listaa
, aquí también podemos agregar a la listab
listas de_+h
dóndeh
está cada número entero en el rango0=>2^(n-1)
.Ahora, tenemos ambas listas
a
yb
empaquetadas y listas para usar. ¿Cómo los uniríamos ahora? Aquí es donde listasW
,T
,G
, yC
vienen en. Se llevará a cabo los índices para cada cuadrante específico de puntos en la rejillal[-1]
. Por ejemplo, reservemos la listaW
como la lista para todos los índices iguales al cuadrante 1 (índice 0) de la cuadrícula. En esta lista, agregaríamos las primeras2^(n-1)
listas de la listaa
, ya que la listaa
contiene todos los índices de puntos en la mitad izquierda de la cuadrícula, y luego los dividimos todos de manera queW
ahora contenga(2^(n-1))*(2^(n-1))
elementos. Haremos lo mismo para la listaT
, pero con la diferencia queT
contendría elementos de la listab
, ya queT
está reservado para el cuadrante 2 (índice 1). La listaG
sería igual a la listaW
, excepto que contendría el resto de los elementos de la listaa
, y la listaC
es la misma que la listaT
, excepto que ahora contiene el resto de los elementos de la listab
. ¡Y eso es! Ahora tenemos valores de índice para cada cuadrante que contiene puntos en la cuadrícula, todos divididos en cuatro listas correspondientes a cada cuadrante. Ahora podemos usar estas 4 listas (W, T, G, C) para decirle al programa qué caracteres debe reemplazar en la cuadrículal[-1]
con cada carácter de la cuadrículal[0]
, que es el primer elemento de la listal
. Como el valor está0
aquí, reemplazaría todos los puntos en el primer cuadrante (índice 0) con lal[0]
lista de utilización de cuadrículaW
.Por lo tanto, finalmente tenemos lo siguiente:
¡Uf! Proceso largo, ¿no es así? Sin embargo, funciona perfectamente y, una vez más, no podría estar más feliz. :)
fuente