Eu estava brincando com infinitas redes de resistores (história longa) quando me deparei com o seguinte padrão recursivo interessante:
|-||
|---
Cada instância desse padrão tem o dobro da largura e a altura. Para ir de um nível do padrão para o próximo, você divide esse retângulo em dois sub-blocos (cada um dos quais é um quadrado NxN):
AB =
|-||
|---
so A =
|-
|-
and B =
||
--
Essas metades são duplicadas e reorganizadas de acordo com o seguinte padrão:
ABAA
ABBB
giving
|-|||-|-
|---|-|-
|-||||||
|-------
Desafio
Escreva um programa / função que, dado um número N
, produza a N
iteração desse design recursivo. Isso é golfe.
O formato de E / S é relativamente branda: você pode retornar uma única string, uma lista de strings, uma matriz 2D de caracteres etc. O espaço em branco à direita é permitido. Você também pode usar a indexação 0 ou 1.
Exemplos
As primeiras várias iterações do padrão são as seguintes:
N = 0
|-
N = 1
|-||
|---
N = 2
|-|||-|-
|---|-|-
|-||||||
|-------
N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------
N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------
Gostaria de saber se existe alguma maneira algébrica curta de calcular essa estrutura.
f(n,x,y)
que possa calcular diretamente se uma determinada coordenada deve conter-
ou|
. Pode envolver operações de módulo ou operações bit a bit. As técnicas que eu vi até agora envolvem cortar / unir matrizes, como mostrado nas especificações.f(x,y)
também funciona, pois sex,y
é válido, então o resultado não dependen
|-
?Respostas:
APL (Dyalog Classic) ,
2925 bytesExperimente online!
⍳2
é o vetor0 1
⍪
transforma em uma matriz 2x1⍉
transpõe, então fica 1x2⎕
entrada avaliada{
}⍣⎕
aplicar uma função que muitas vezes⍪⍨⍵
concatenar o argumento em cima de si - uma matriz 2x2a←
lembre-se comoa
~
negar⍉
transpor⌽
inverter horizontalmente⊖
inverter verticalmentea,
concatenar coma
à esquerda'|-'[
]
use a matriz como índices na string'|-'
, ou seja, transforme 0 em|
e 1 em-
fonte
JavaScript (Node.js) ,
130...1069492 bytesJoguei golfe com meu método alternativo e corrigi os caracteres, -14 bytes Obrigado @Shaggy
Experimente online!
Minha abordagem original (
106102 bytes)-4 bytes Obrigado @ShaggyExperimente online!
Explicação & Sem Golfe:
Meu método alternativo original, se
"|"->"2", "-"->"1"
for permitido,105104 bytes:Experimente online!
Acabei de descobrir algum método algébrico para esse problema.
Experimente online!
(finalmente, uma função cuja duração é comparável à minha resposta original)
f(n, x, y)
calcula o tipo de bloco no bloco (x, y) nan
iteração da seguinte substituição:de onde
0 = "|-", 1 = "||", 2 = "--"
, começandof(0, 0, 0) = 0
.Em seguida,
g(x)(y)
calcula o símbolo em (x, y) do padrão original.fonte
Stax ,
241715 bytesExecute e depure
Aqui está a representação ascii do mesmo programa.
A idéia básica é começar com a grade de geração 0 e depois repetir um bloco que expande a grade.
fonte
Tela ,
1716 bytesExperimente aqui!
Explicação, mostrando a pilha para a entrada 1:
Atualizado para 16 bytes corrigindo um erro em que os valores definidos para
α
/ω
para o trabalho não foram copiados corretamente (o Canvas deve ser totalmente imutável, mas, infelizmente, não era).fonte
Python 2 ,
8877 bytes-11 bytes thansk para Lynn
Experimente online!
fonte
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
Experimente online!
fonte
66
:$.=map{s/.{$.}$/$&$
$/,push@1,$
. $ & X3} @ 1for (@ 1 = "| -") x <>; diga para @Casca , 17 bytes
1 indexado. Experimente online!
Explicação
fonte
Geléia ,
2119 bytesExperimente online!
Explicação:
Inicialmente, o valor é
⁾|-
esse["|","-"]
.O último link (
Ç
), dado[A, B]
, retornará. A
¡
aplicar repetidamente o último número de link (entrada) de vezes, eZY
formata.Explicação para o último link:
fonte
Limpo ,
121106 bytesExperimente online!
fonte
Haskell , 86 bytes
Experimente online!
Bem simples. Saída é uma lista de strings. Pegamos a versão anterior e dividimos cada linha pela metade e depois as coletamos em duas novas listas usando
unzip
. Então é simplesmente uma questão de combinar as matrizes da maneira certafonte
J , 49 bytes
Uma tradução desajeitada da solução APL da ngn. Tive problemas para torná-lo tácito - aprecio qualquer conselho.
Experimente online!
fonte
Carvão ,
4746 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Para obter uma posição consistente do cursor para o loop a seguir, preciso imprimir o passo 0 na posição (-2, -2) e deixar o cursor em (-2, 0). (Isso pode ser devido a um bug no Charcoal.)
Faça um loop sobre as primeiras
N
potências de 2.Faça cópias da saída anterior com várias compensações, resultando em uma tela que contém a próxima etapa desejada em um retângulo dentro dela.
Mova para a posição desse retângulo e apare a tela.
Solução alternativa, também 46 bytes:
Experimente online! Link é a versão detalhada do código. Explicação:
Este passo no tempo 0 deve ser impresso na posição (2, 0), mas pelo menos a posição do cursor não importa.
Faça um loop sobre as primeiras
N
potências de 2.Faça cópias da saída anterior com várias compensações, resultando em uma tela que contém a próxima etapa desejada em um retângulo dentro dela.
Mova para a posição desse retângulo e apare a tela.
fonte
R , 126 bytes
Experimente online!
Retorna a
matrix
. Há um pouco de código no link do TIO para que ele seja impresso com facilidade para facilitar a verificação.fonte
K (ngn / k) , 25 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) ,
6765 bytesExperimente online!
Implementação direta da recursão. Retorna uma matriz de caracteres agrupados em uma lista.
fonte