Estaba jugando con redes de resistencia infinita (larga historia) cuando me encontré con el siguiente patrón recursivo interesante:
|-||
|---
Cada instancia de este patrón es dos veces más ancha que alta. Para pasar de un nivel del patrón al siguiente, divide este rectángulo en dos subbloques (cada uno de los cuales es un cuadrado NxN):
AB =
|-||
|---
so A =
|-
|-
and B =
||
--
Estas mitades se duplican y reorganizan de acuerdo con el siguiente patrón:
ABAA
ABBB
giving
|-|||-|-
|---|-|-
|-||||||
|-------
Reto
Escriba un programa / función que, dado un número N
, produzca la N
iteración de este diseño recursivo. Esto es golf.
El formato de E / S es relativamente indulgente: puede devolver una sola cadena, una lista de cadenas, una matriz 2D de caracteres, etc. Se permite un espacio en blanco al final arbitrario. También puede usar 0 o 1 indexación.
Ejemplos
Las primeras varias iteraciones del patrón son las siguientes:
N = 0
|-
N = 1
|-||
|---
N = 2
|-|||-|-
|---|-|-
|-||||||
|-------
N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------
N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------
Me pregunto si hay alguna forma algebraica corta de calcular esta estructura.
f(n,x,y)
que puede calcular directamente si una determinada coordenada debe contener-
o|
. Puede implicar operaciones de módulo u operaciones bit a bit. Las técnicas que he visto hasta ahora implican cortar / unir matrices como se muestra en la especificación.f(x,y)
también funciona, ya que six,y
es válido, entonces el resultado no depende den
|-
?Respuestas:
APL (Dyalog Classic) ,
2925 bytesPruébalo en línea!
⍳2
es el vector0 1
⍪
lo convierte en una matriz 2x1⍉
lo transpone, por lo que se convierte en 1x2⎕
entrada evaluada{
}⍣⎕
aplicar una función que muchas veces⍪⍨⍵
concatenar el argumento encima de sí mismo: una matriz de 2x2a←
recuerda comoa
~
negar⍉
transponer⌽
revertir horizontalmente⊖
revertir verticalmentea,
concatenar cona
a la izquierda'|-'[
]
usa la matriz como índices en la cadena'|-'
, es decir, convierte 0 en|
y 1 en-
fuente
JavaScript (Node.js) ,
130...1069492 bytesGolfé desde mi método alternativo y arreglé los caracteres, -14 bytes Gracias @Shaggy
Pruébalo en línea!
Mi enfoque original (
106102 bytes)-4 bytes Gracias @ShaggyPruébalo en línea!
Explicación y sin golf:
Mi método alternativo original, si
"|"->"2", "-"->"1"
está permitido,105104 bytes:Pruébalo en línea!
Acabo de descubrir algún método algebraico para este problema.
Pruébalo en línea!
(Finalmente una función cuya longitud es comparable a mi respuesta original)
f(n, x, y)
calcula el tipo de bloque en el bloque (x, y) enn
la iteración de la siguiente sustitución:de donde
0 = "|-", 1 = "||", 2 = "--"
, a partir def(0, 0, 0) = 0
.Luego,
g(x)(y)
calcula el símbolo en (x, y) del patrón original.fuente
Stax ,
241715 bytesEjecutar y depurarlo
Aquí está la representación ascii del mismo programa.
La idea básica es comenzar con la cuadrícula de generación 0 y luego repetir un bloque que expande la cuadrícula.
fuente
Lienzo ,
1716 bytesPruébalo aquí!
Explicación, que muestra la pila para la entrada de 1:
Se actualizó a 16 bytes corrigiendo un error en el que los valores establecidos para
α
/ω
para trabajar no se copiaron correctamente (se supone que Canvas es totalmente inmutable, pero, por desgracia, no lo fue).fuente
Python 2 ,
8877 bytes-11 bytes thansk a Lynn
Pruébalo en línea!
fuente
f=lambda x:x<1and['|-']or[n+2*n[i:i+2**x/2]for i in(0,2**x/2)for n in f(x-1)]
Perl 5 , 72 bytes
Pruébalo en línea!
fuente
66
:$.=map{s/.{$.}$/$&$
$/,push@1,$
. $ & X3} @ 1for (@ 1 = "| -") x <>; digamos para @ 1`Casco , 17 bytes
1 indexado. Pruébalo en línea!
Explicación
fuente
Jalea ,
2119 bytesPruébalo en línea!
Explicación:
Inicialmente, el valor es
⁾|-
, es decir["|","-"]
.El último enlace (
Ç
), dado[A, B]
, regresará. El
¡
aplican repetidamente el último número de enlace (entrada) de veces, yZY
lo formatea.Explicación del último enlace:
fuente
Limpio ,
121106bytesPruébalo en línea!
fuente
Haskell , 86 bytes
Pruébalo en línea!
Bastante simple. La salida es una lista de cadenas. Tomamos la versión anterior y dividimos cada línea por la mitad, luego las recopilamos en dos listas nuevas usando
unzip
. Entonces es simplemente una cuestión de combinar las matrices juntas de la manera correctafuente
J , 49 bytes
Una traducción torpe de la solución APL de ngn. Tuve problemas para hacerlo tácito. Apreciaré cualquier consejo.
Pruébalo en línea!
fuente
Carbón ,
4746 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Para obtener una posición consistente del cursor para el siguiente ciclo, tengo que imprimir el paso 0 en la posición (-2, -2) y dejar el cursor en (-2, 0). (Esto podría deberse a un error en el carbón).
Recorre los primeros
N
poderes de 2.Haga copias de la salida anterior con varios desplazamientos que den como resultado un lienzo que contenga el siguiente paso deseado en un rectángulo dentro de él.
Muévase a la posición de ese rectángulo y recorte el lienzo.
Solución alternativa, también 46 bytes:
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Esta vez, el paso 0 debe imprimirse en la posición (2, 0), pero al menos la posición del cursor no importa.
Recorre los primeros
N
poderes de 2.Haga copias de la salida anterior con varios desplazamientos que den como resultado un lienzo que contenga el siguiente paso deseado en un rectángulo dentro de él.
Muévase a la posición de ese rectángulo y recorte el lienzo.
fuente
R , 126 bytes
Pruébalo en línea!
Devuelve a
matrix
. Hay un poco de código en el enlace TIO para que se imprima bien y facilitar la verificación.fuente
K (ngn / k) , 25 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
6765 bytesPruébalo en línea!
Implementación directa de la recursividad. Devuelve una matriz de caracteres envueltos en una lista.
fuente