A curva de Hilbert é um fractal de preenchimento de espaço que pode ser representado como um sistema Lindenmayer com gerações sucessivas assim:
Agradecemos a http://www.texample.net/tikz/examples/hilbert-curve/ pela imagem.
Objetivo
Escreva o programa mais curto possível (em bytes) que pega um número inteiro positivo n de stdin e desenha a curva de Hilbert de enésima ordem para stdout usando apenas barra invertida, barra invertida, espaço e nova linha.
Por exemplo, se a entrada for 1
a saída, deve ser
\
\/
Se a entrada for 2
a saída deve ser
/
\/\
/\ \
/ /\/
\ \
\/
Se a entrada for 3
a saída deve ser
\
/\/
/ /\
\/\ \ \
/\ / / /
/ / \/ \/\
\ \/\ /\ \
\/ / / / /\/
/\/ / \ \
\ \/\ \/
\/\ \
/ /\/
\ \
\/
E assim por diante. (Eles ficam mais agradáveis se você os colar em algo com menos espaçamento entre linhas.)
A saída não deve conter novas linhas acima ou abaixo das extremidades da curva, nem espaços à direita em nenhuma linha.
.map(&:rstrip)
foi necessário adicionar para atender ao requisito "sem espaços à direita".x
e reduzir a tarefa paray
ed
, para um total de 205 caracteres (consulte o mesmo link de antes).Python, 282
Isso utiliza uma abordagem recursiva para construir a curva de Hilbert de enésima ordem da curva anterior. As curvas são representadas como uma matriz numpy 2D para melhor fatiamento e manipulação.
aqui estão alguns exemplos:
fonte
Malsys -
234221 caracteresSinto o cheiro de alguns sistemas L aqui :) Malsys é um intérprete online do sistema L. Esta não é uma entrada realmente séria, mas senti que esta solução é um pouco interessante.
A sintaxe do Malsys não é muito boa para jogar golfe, pois contém muitas palavras-chave longas, mas ainda assim é bastante curta, legível e expressiva.
http://malsys.cz/g/3DcVFMWn
Intérprete: http://malsys.cz/Process
Versão Golfed:
E a curva hexagonal de Gosper da Ascii? :)
http://malsys.cz/g/ae5v5vGB
fonte
JavaScript (ES6) 313
340Editar Algum caractere removido usando práticas muito ruins - como a variável global w em vez de um valor de retorno da função H
Convertendo a posição x, y na distância d (consulte a Wikipedia ) para cada x, y e verificando se as posições mais próximas estão conectadas,
Teste no console do FireFox. Entrada via pop-up, saída via console.log.
Não há espaços à direita nem novas linhas acima ou abaixo da imagem. Mas cada linha é finalizada com uma nova linha, acho que é a maneira correta de criar uma imagem artística Ascii.
fonte
alert
vez deconsole.log
. Você também tem um espaço extra depois dafor
quarta linha e deve conseguir se livrar dessa última quebra de linha.Perl, 270 caracteres
Super golfed
Não é muito golfe
Provavelmente poderia diminuir mais se eu entendesse melhor Perl. Usa uma abordagem de sistema Lindenmayer usando regras de produção definidas na linha 1.
fonte
APL (Dyalog Unicode) , SBCS de 90 bytes
Experimente online!
2 2⍴0
uma matriz 2x2 de zeros{ }⍣⎕
introduza N e aplique uma função N vezes⍵,⍨-⊖⍵
concatenar à esquerda da matriz uma cópia invertida e negada verticalmente de si mesma(2×s←⍴⍵)↑
teclado com zeros para que as dimensões (lembradas comos
) sejam duas vezes maiores que o argumento¯.5×≢⍵
gire para baixo para centralizá-lo verticalmente, imprensado entre os zeros do preenchimento2@(¯1 0+3 1×s÷2)
coloque 2-s em locais específicos - essas são as barras de ligação entre instâncias menores do fractal(⊢+⍉)
adicione a matriz com sua auto transposta3|
módulo 3; usamos negação; portanto, observe que -1≡2 (mod 3) e -2≡1 (mod 3)' /\'[ ]
use os elementos da matriz como índices na sequência' /\'
1↓∘⍉∘⌽⍣4
aparar a margem vazia de 1 elemento em todos os lados↓
dividido em linhas' +$'⎕r''¨
remover espaços à direita de cada um (este desafio exige)⎕∘←¨
saída cadafonte