visão global
Escreva um programa que imprima padrões simples de fractal, com um padrão de bits que codifica o fractal, mais o fator de escala por geração do fractal e o número de gerações.
Explicação
Aqui está uma representação ASCII do tapete Sierpinski :
Geração 0:
#
Geração 1:
# # #
# #
# # #
Geração 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
A geração n + 1 do tapete ASCII Sierpinski é composta de uma grade 3x3 contendo 8 cópias da geração n, com o elemento central da grade ausente.
Portanto, como é definido usando uma grade 3x3 e fica 3 vezes maior em largura e altura a cada geração, podemos dizer que possui um fator de escala de 3.
Poderíamos definir um padrão de bits para o tapete de Sierpinski numerando os elementos na grade 3x3 de 0 a 8, de cima para baixo, da esquerda para a direita e definindo o bit correspondente de um número inteiro se a geração n + 1 contiver um cópia da geração n nessa posição da grade:
bit: place value: bit pattern: bit value:
0 1 2 1 2 4 1 1 1 1 2 4
3 4 5 8 16 32 1 0 1 8 0 32
6 7 8 64 128 256 1 1 1 64 128 256
integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495
Para um fator de escala de 2, o padrão de bits seria organizado assim:
0 1
2 3
e assim por diante.
Sua tarefa é escrever um programa que aceite um padrão de bits dessa forma, um fator de escala (por exemplo, 3 para o tapete Sierpinski) e um número de geração e que produza um fractal ASCII.
Entrada
Seu programa deve aceitar três números inteiros na seguinte ordem: um padrão de bits, um fator de escala (variando de 2 a 5, inclusive) e uma contagem de geração (variando de 0 a 5, inclusive).
Você não precisa executar nenhuma validação de entrada nesses valores e é perfeitamente aceitável se o programa funcionar com valores maiores que os intervalos especificados.
As entradas podem ser passadas de qualquer forma (tuplas, lista separada por vírgula / espaço, etc.)
Saída
O programa deve gerar um fractal composto pelo #
caractere seguido por um espaço nas posições em que o fractal é definido, espaços duplos onde não está e um caractere de nova linha no final de cada linha, imprimindo-os ou retornando uma string de uma função.
Exemplos
Entrada:
495,3,3
Saída (geração 3 do tapete Sierpinski):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Entrada:
7,2,5
Saída ( triângulo de Sierpinski ):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # #
# # # #
# # # #
# #
# # # #
# #
# #
#
Entrada:
325,3,3
Saída ( Poeira Cantor ):
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
Entrada
186,3,3
Saída ( fractal Vicsek ):
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
# # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
Entrada:
279,3,3
Saída (exemplo de um fractal assimétrico):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
etc.
Notas:
- Isso é código-golfe, então a resposta mais curta em bytes vence
- Seu programa pode ser autônomo ou uma função chamada com os 3 parâmetros de entrada e retorna (ou imprime) uma string
- A geração 0 é definida como
#
(a#
seguida por um espaço), mesmo para um padrão de bits 0. - Uma nova linha à direita na última linha é opcional, mas permitida, assim como qualquer quantidade de espaço em branco à direita em cada linha.
"##"
para"# "
. Vejo que um espaço à direita no final da linha está incluído em seus exemplos, é necessário? . Pela última regra, eu diria que é opcional, mas o fato de você precisar de um espaço à direita para a geração 0 me faz pensar. Também acho que você deve indicar o espaço em branco máximo e as novas linhas (você o tem no plural) permitido. Como exemplo extremo, eu sempre poderia começar com uma matriz de 5 ^ 6 = 15625 linhas de 2 * 5 ^ 6 espaços e depois substituir#
s. Na maioria dos casos de entrada que é uma enorme quantidade de espaço em branco não utilizado279,3,3
?Respostas:
APL (Dyalog Unicode) , SBCS de 37 bytes
Experimente online!
fonte
Lisp comum,
248242 bytesUngolfed
Explicação
dotimes
) e calculamos se cada célula deve ser desenhada (abordagem semelhante à transmissão de raios). Isso é feito olhando recursivamente dentro do fractal com af
função auxiliar."# "
ou imprima" "
. É claro que também imprimimos novas linhas no final de cada linha.Por exemplo, o triângulo de Sierpinsky é representado por
S=7
eR=2
. Na geração 3, o tamanho do quadrado é 2 3 = 8. Para cada célula (x, y) , acontece o seguinte:f
é chamado com x , y , g vinculado a 3 e s vinculado a 4 (8/2)truncate
retorna o quociente e o restante, que são vinculados respectivamente a px e x (reutilizamos o mesmo símbolo x , mas isso não é um problema).f
recursivamente com as novas ligações para x e y . Essas são agora a posição relativa dentro do fractal interno. Passamos G-1 para a geração es / 2 para representar a metade do comprimento do fractal.Exemplo
O cálculo da 8ª geração do tapete Sierpinski usando
(fractal 495 3 8)
leva 24,7 segundos e gera um arquivo de texto de saída de 83 MB. Eu escrevi uma versão ligeiramente modificada que gera uma imagem. Para os mesmos parâmetros, o arquivo GIF pesa 1,5 MB (o mesmo tempo de computação):Vicsek (clique para ver o tamanho original):
fonte
)
em uma fileira!Pitão, 38 bytes
Experimente on-line: Conjunto regular de entrada / teste
A explicação segue depois.
fonte
186 3 5
(intérprete on-line), mas, além disso, estou realmente impressionado com o quão curto isso é.Ruby, 154
A pontuação é apenas para a função. Apresentado não-destruído abaixo no programa de teste. O único golfe que estou reivindicando no momento é a remoção de comentários e recuos. Mais tarde vou jogar golfe. No momento, estou me divertindo brincando com o programa.
A função recebe seis argumentos, mas na chamada inicial apenas os três primeiros são fornecidos por especificação. Isso faz com que os três argumentos restantes sejam configurados com os valores padrão e, em particular, a cadeia de caracteres em
a
que a saída está armazenada é criada e inicializada para linhas de espaços terminadas por novas linhas. Como efeito colateral, a variável global$w
também é criada, indicando o número de símbolos por linha.Quando a função se chama recursivamente, ela fornece todos os seis argumentos, incluindo a string
a
e as coordenadas x e y do canto superior esquerdo da próxima recursãoO restante do programa é bem direto, conforme indicado nos comentários.
Saída
Aqui está um conjunto de fractais vagamente baseado na forma das letras da palavra GOLFE. Cartas mais realistas poderiam ser obtidas com bitmaps maiores. Como mostra o último exemplo, os fractais mais interessantes são descobertos por acidente.
fonte
CJam, 45
Implementação da minha primeira ideia. Experimente online
Basicamente, ele começa com uma matriz 1 * 1 contendo 3 (a diferença entre '#' e ''), depois multiplica repetidamente cada número na matriz com o padrão de bits (matriz 0/1) e combina as matrizes resultantes em uma matriz maior. No final, ele adiciona um espaço a cada número e se junta a espaços e novas linhas.
Segunda ideia, 49
Experimente online
Isso gera todas as coordenadas da matriz de saída como matrizes de pares de números <contagem de geração> menores que o fator de escala (todas essas combinações); em seguida, para cada par de números, obtém o bit correspondente do padrão e para cada matriz de coordenadas multiplica os bits e multiplica por 3. O processamento final é o mesmo.
Provavelmente há espaço para mais golfe.
fonte
C, 316 bytes
Sem golfe:
fonte
Scala
293299ungolfed:
exemplos:
primeiro corte, provavelmente pode ser jogado um pouco mais longe ...
fonte
#
. Além de ser exigido pelas especificações, ele realmente aprimora a aparência da sua saída.Matlab, 115 bytes
O
kron
produto Kronecker torna tudo muito mais fácil:fonte
de2bi
só funcione se você tiver a Caixa de ferramentas do Communications Systems. Não funciona sem ele. Seria necessáriodec2bin
.de2bi
não faz o mesmo quedec2bin
.)C, 158 bytes
fonte
K5, 70 bytes
É um começo:
Em ação:
fonte