Introdução
Nesse desafio, uma matriz 2 × 2 é indexada assim:
0 1
2 3
Definimos uma família de padrões do tipo fractal F(L)
, onde L
há uma n
lista longa desses índices e F(L)
seu tamanho .2n-1 × 2n-1
- Se
L == []
, entãoF(L)
é o padrão 1 × 1#
. Se
L != []
, então,F(L)
é construído da seguinte maneira. SejaP
o padrão obtidoL
com o primeiro elemento removido. Pegue quatro grades de tamanho preenchidas com pontos e substitua a grade indexada por pelo padrão . Em seguida, cole as grades usando uma camada de hashes entre elas. Aqui estão diagramas para os quatro 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] ...#... ...#... #... ...#
Exemplo
Considere a entrada L = [2,0]
. Começamos com a grade 1 × 1 #
e atravessamos L
da direita. O elemento mais à direita é 0
, então, pegamos quatro cópias da grade 1 × 1 .
, substituímos a primeira por #
e colamos com hashes. Isso resulta na grade 3 × 3
##.
###
.#.
O próximo elemento é 2
, então, pegamos quatro cópias da grade 3 × 3 de .
s e substituímos a terceira pela grade acima. As quatro grades são
... ... ##. ...
... ... ### ...
... ... .#. ...
e colá-los junto com #
s resulta na grade 7 × 7
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
Esta é a nossa saída final.
Entrada
Sua entrada é uma lista L
dos índices 0, 1, 2, 3
. Você pode tomá-lo como uma lista de números inteiros ou uma sequência de dígitos. Observe que ele pode estar vazio e pode conter duplicatas. O comprimento de L
é no máximo 5.
Resultado
Sua saída é o padrão F(L)
como uma sequência delimitada por nova linha.
Regras e pontuação
Você pode escrever um programa completo ou uma função. a menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
[]
#
[0]
##.
###
.#.
[3]
.#.
###
.##
[2,0]
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
[1,1]
...#.##
...####
...#.#.
#######
...#...
...#...
...#...
[1,2,0]
.......#...#...
.......#...#...
.......#...#...
.......########
.......###.#...
.......#####...
.......#.#.#...
###############
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
[3,3,1]
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
###############
.......#...#...
.......#...#...
.......#...#...
.......########
.......#...#.##
.......#...####
.......#...#.#.
[0,1,2,3]
.......#...#...#...............
.......#...#...#...............
.......#...#...#...............
.......#########...............
.......#.#.#...#...............
.......#####...#...............
.......#.###...#...............
################...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
###############################
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
[0,0,1,2,3]
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#########...............#...............................
.......#.#.#...#...............#...............................
.......#####...#...............#...............................
.......#.###...#...............#...............................
################...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
################################...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
###############################################################
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
#
?L !=[]
nesse exemplo, pois possui 1 ou mais elementos. Isso significa que F (L) é sempre um#
no início?L = [2,0]
, você corta a cabeça e olha para o padrãoF([0])
, depois corta a cabeça[0]
e olha para o padrãoF([])
, que é a grade 1x1#
. Depois, use o índice cortado0
para criar o padrão 3x3 e use o índice cortado2
para criar o padrão 7x7. Para responder à sua pergunta: sim, você sempre começa com a grade 1x1, pois esse é o caso base da recursão.Respostas:
CJam,
5947434140 bytesAgradecimentos ao Sp3000 por economizar 1 byte.
Teste aqui.
Explicação
Ligeiramente desatualizado. Irá corrigir mais tarde.
Todas as reordenações dimensionais das listas 4D estão me deixando tonto ...
Este código implementa a especificação literalmente, usando o algoritmo iterativo da seção de exemplo, em vez de sua definição recursiva. Um grande truque de golfe é que eu estou usando espaços em vez de
#
durante o cálculo e apenas os substituindo#
no final, o que simplifica o código em um só lugar e me permite usar emS
vez de'#
ou"#"
em vários.fonte
MATL ,
4241 bytesExperimente online!
Explicação
Isso funciona iterativamente usando um produto Kronecker para estender a matriz em cada iteração. A matriz é construída com
0
e em1
vez de.
e#
, e no final são substituídas pelos caracteres apropriados.Haverá tantas iterações quanto o tamanho da entrada. A entrada é processada da direita para a esquerda. O índice de iteração começa em
1
.Usando o exemplo no desafio, com entrada
[2,0]
, a matriz é inicializada comoIsso corresponde ao inicial
1
(#
) estendido por uma linha e uma coluna, cujo objetivo será esclarecido posteriormente. Os valores nessas colunas não são importantes, pois serão substituídos; eles poderiam ser igualmente:Em cada iteração, a matriz existente é multiplicada por Kronecker por uma matriz 2 x 2 zero-um que contém
1
na posição indicada pela entrada atual da entrada e0
nas outras entradas. No exemplo da iteração i = 1, como a entrada de entrada mais à direita é0
, a matriz zero-um ée o produto Kronecker dessas duas matrizes é
Em seguida, a linha e a coluna com o índice
2^i
são preenchidas com as seguintes:As três primeiras linhas e colunas constituem o resultado da primeira iteração. Como antes, há uma linha e coluna extras, que são úteis para estender a matriz na próxima iteração.
Na iteração i = 2, como o valor atual de entrada contém
2
a matriz acima, é multiplicado por Kronecker porque dá
Preencher a
2^i
-ésima linha e coluna com essesComo esta é a última iteração, a linha e a coluna extras são removidas:
e a substituição de caracteres é feita para produzir o resultado final:
A descrição detalhada do código a seguir:
fonte
Haskell,
123122 bytesExemplo de uso:
Como funciona:
fonte
JavaScript (ES6),
171152 bytesObtém o resultado da chamada recursiva e, em seguida, substitui cada linha por ela mesma, além de um hash e de uma sequência de pontos do mesmo comprimento, na ordem inversa, se necessário, e a partir desse resultado parcial, cria uma sequência de pontos, exceto as linhas de nova linha e a coluna central de hashes e também uma sequência de hashes com as novas linhas circundantes, em seguida, une essas três strings na ordem apropriada.
fonte
Ruby,
143134 bytesUma função anônima.
1 byte salvo por um rearranjo da primeira linha. 6 bytes salvos alterando a maneira como z é incrementado de uma fórmula para uma tabela. 2 bytes salvos ao eliminar a variável
w
.Ungolfed in program program
fonte
Ruby, 150 bytes
Função anônima. Usa uma chamada recursiva para criar uma lista de cadeias, uma cadeia por linha e, em seguida, junta todas elas no final.
fonte
Python 3.5, 1151 bytes:
Não é muito um código de golfe, mas tudo bem. Tentarei podá-lo mais com o tempo, sempre que puder.
Uma maneira bastante ingênua de fazer isso, mas, no entanto, atualmente funciona perfeitamente e, como você pode ver, não usa módulos / bibliotecas externas. Além disso, ele pode assumir forma mais de 5 itens na lista fornecida
s
sem perder precisão (ou seja, se o seu hardware pode lidar com isso). Satisfaz todos os requisitos e eu não poderia estar mais feliz com o que recebi. :)Agora também pode não apenas aceitar qualquer número dentro do intervalo
0=>3
como qualquer um dos valores, mas também qualquer número , período, graças ao&
operador bit a bit! Você pode ler mais sobre eles aqui . Agora, por exemplo,[4,4,1,2,3]
como a lista de entrada é a mesma que[0,0,1,2,3]
.Nota: A entrada deve ser fornecida como uma lista
Ungolfed com explicação:
Explicação mais ampla e muito mais visualmente atraente:
Para uma explicação mais ampla e visualmente mais atraente, considere a segunda vez em que passa o loop "principal" no código acima, no qual está a lista de entrada
[0,2]
. Nesse caso, os elementos na lista "principal"l
seriam:e
e a lista
y
conteria apenas0
. Aproveitando a maneira do Python de indexar o último elemento da gradel[-1]
, podemos rotular os elementos mais à esquerda da grade da seguinte maneira:Que padrão você vê? Todo índice no lado esquerdo da grade é um múltiplo de 8 e, como a equação
2^(n-1)-1
produz o comprimento de cada segmento de pontos da grade, podemos fazer isso((2^(n-1)-1)*2)+2
para encontrar o comprimento da borda superior da grade como um todo (+2 para incluir o meio#
e o\n
no final). Podemos usar essa equação, que chamaremosi
para encontrar os valores de índice de cada elemento no lado esquerdo de uma grade de qualquer tamanho, criando uma lista e anexando à lista todos os números inteiros, que chamaremos_
no intervalo0=>length of grid l[-1]
, de modo que esse item seja múltiplo dei
E também de modo que_
NÃO seja iguali*(2^(n-1)-1)
, para que possamos excluir o segmento intermediário de#
s separando a metade superior da metade inferior. Mas queremos TODOS os elementos de ponto da esquerda, e não apenas os elementos do lado esquerdo. Bem, há uma correção para isso, e isso seria simplesmente anexar à lista uma lista contendoi+h
onde h é todo número inteiro no intervalo0=>2^(n-1)
sempre que um valor do intervalo0=>length of grid l[-1]
é adicionado à lista, para que a cada vez haja número de valores adicionados à lista quanto o comprimento de um quadrante de pontos. E isso é listaa
.Mas agora, que tal os pontos na metade direita? Bem, vejamos a indexação de uma maneira diferente:
Como você pode ver, os valores agora no meio são os que precisamos, pois são o início do índice de todos os segmentos de pontos no lado direito da grade. Agora, qual é o padrão aqui? Bem, se já não é óbvio o suficiente, agora os valores médios são todos múltiplos de
i/2
! Com essas informações, agora podemos criar outra lista,b
à qual os múltiplos dei/2
são adicionados a partir do intervalo, de0=>length of grid l[-1]
modo que cada número inteiro desse intervalo, que chamaremos novamente_
, NÃO seja igual(i/2)*(p*2)
a excluir a linha de#
s que separa o topo e metades inferiores, E tal que _ NÃO já esteja na lista a, pois não precisamos realmente de 8,16,32, etc. na listab
. E agora, novamente, não queremos apenas esses índices específicos. Queremos TODOS os caracteres de ponto no lado direito da grade. Bem, assim como fizemos na listaa
, aqui também podemos adicionar à listab
de_+h
ondeh
cada número inteiro está no intervalo0=>2^(n-1)
.Agora, temos ambas as listas
a
eb
embalado e pronto para ir. Como os reuniríamos agora? Este é o lugar onde as listasW
,T
,G
, eC
entrar. Eles vão manter os índices para cada quadrante específico de pontos em gradel[-1]
. Por exemplo, vamos reservar listW
como a lista para todos os índices iguais ao quadrante 1 (índice 0) da grade. Nesta lista, adicionaríamos as primeiras2^(n-1)
listas da listaa
, pois lista
contém todos os índices de pontos na metade esquerda da grade e, em seguida, os dividimos para queW
agora contenha(2^(n-1))*(2^(n-1))
elementos. Faríamos o mesmo para a listaT
, mas com a diferença queT
conteria elementos da listab
, poisT
está reservado para o quadrante 2 (índice 1). ListaG
seria o mesmo que listaW
, exceto que conteria o restante dos elementos da listaa
e listaC
é o mesmo que listaT
, exceto que agora contém o restante dos elementos da listab
. E é isso! Agora temos valores de índice para cada quadrante contendo pontos na grade, todos divididos em quatro listas correspondentes a cada quadrante. Agora podemos usar essas 4 listas (W, T, G, C) para informar ao programa quais caracteres ele deve substituir na gradel[-1]
com cada caractere da gradel[0]
, que é o primeiro elemento da listal
. Como o valor está0
aqui, ele substituiria todos os pontos no primeiro quadrante (índice 0) pelal[0]
lista de utilização da gradeW
.Portanto, finalmente temos o seguinte:
Ufa! Processo longo, não é? No entanto, ele funciona perfeitamente e, novamente, eu não poderia estar mais feliz. :)
fonte