Uma curva de Hilbert é um tipo de curva de preenchimento de espaço e basicamente mapeia uma linha para um plano. Cada ponto na linha corresponde a apenas um ponto no plano e cada ponto no plano corresponde a apenas um ponto na linha. São mostradas as iterações de 0 a 4 da Curva de Hilbert:
Iterações de 0 a 4:
O objetivo desta tarefa: Escreva um código que desenhe a quarta iteração da Curva de Hilbert, conforme definido acima. Seu código deve estar completo - em outras palavras, se você criar uma função para desenhar a Curva de Hilbert, seu código deverá chamar essa função. A saída pode ser exibida diretamente na tela ou você pode gravar a saída em um arquivo de imagem. A curva pode ser girada ou invertida, mas as linhas devem se cruzar em ângulos retos e a saída não pode ser esticada. A arte ASCII é apreciada, mas não será aceita. O menor código em bytes vence!
fonte
Respostas:
R, 90 bytes
Porta R descarada do algoritmo usado no link postado por @Luis Mendo.
Pois
n=5
temos:fonte
MATL ,
3938 bytesIsso leva o número de iterações como entrada. Se você deseja codificá-lo, substitua
i
pelo número.O programa é uma porta do código Matlab de Jonas Lundgren mostrada aqui .
O resultado é apresentado abaixo. Você também pode experimentá-lo no MATL Online! Demora alguns segundos para produzir a saída. Este compilador é experimental; pode ser necessário atualizar a página e pressionar "Executar" novamente se não funcionar inicialmente.
Explicação
fonte
Matlab,
264262161 bytesIsso ainda funciona da mesma forma, exceto que basicamente calculamos a "derivada" da curva de hilbert, que então "integramos" via `cumsum``. Isso reduz o tamanho do código em vários bytes.
Versão antiga
Esta é apenas uma abordagem recursiva simples. Usei números complexos para armazenar informações vetoriais por simplicidade. Você pode alterar a curva na peça
h(0,1,1+i,4)
. O primeiro argumentop=0
é a posição inicial, o segundo argumentof
é uma bandeira para a orientação (+1
ou-1
), o terceiro argumentod
é a direção / rotação na qual a curva deve ser desenhada e o quartol
é a profundidade da recursão.Isto é o que parece nas versões mais antigas:
É assim que é em 2015b:
->fonte
cumsum
idéia que é simplesmente brilhante!MATLAB / oitava, 202 bytes
Percebi que a versão vinculada ao @LuisMendo
émuito mais curta que a solução "handmade" anterior , mas usa uma abordagem totalmente diferente. Estou postando uma versão golfada aqui agora como CW:Esta versão é baseada na abordagem do sistema Lindenmayer:
fonte
JavaScript (ES6),
266...233232 bytesUma renderização SVG da Curva de Hilbert.
Guardado 1 byte graças a Neil
fonte
fill=none
Python 3,
177175171 bytesUma implementação simples do sistema Lindenmayer para a curva de Hilbert. Sugestões de golfe são bem-vindas!
Edit: -2 bytes graças ao Kade. -3 bytes da reestruturação de como a curva de Hilbert é construída. -1 byte com agradecimentos a ETHproductions.
Ungolfing
fonte
t
pode salvar dois bytes:t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]
. Desde o padrão é quase o mesmo para os dois Eu quero saber se há alguma maneira de usar isso ..if c>"E":
paraif"E"<c:
salvar um byte?MSWLogo (Versão 6.5b), 136 bytes
Com base no programa final da curva de Hilbert aqui .
h
É definida uma função , que leva o número de iterações:n
(com base em 1), ângulo:a
, comprimento:l
. É recursivo, chamando uma iteração mais baixa de si mesmo com o ângulo:a
negado em duas instâncias para obter a orientação correta.rt :a
,lt :a
gire a tartaruga (triângulo cujo caminho é traçado) para a direita, deixada em:a
graus.fd :l
move a tartaruga para a frente em:l
etapas.Finalmente, a função é chamada:
h 5 90 9
. A tartaruga pode ser escondida por 2 bytes extrasht
,.fonte
ht
.Mathematica 128 Bytes
Substitua os 4 acima por um número diferente de iterações, se desejar.
Feito como um sistema Lindenmayer com seqüências inteiras em vez de sequências de strings, a segunda regra de produção é apenas a negativa da primeira regra. Esta versão tem 151 bytes.
A porta do código MATLAB de Jonas Lundgren é de apenas 128 bytes.
Vejo que em uma versão futura do Mathematica, isso pode se tornar muito curto, algo como:
http://mathworld.wolfram.com/HilbertCurve.html
fonte
LindenMASM , 63 bytes
Outra pergunta com uma resposta LindenMASM? Impressionante!
Mais uma vez, devido a alguns erros de desenho do Python
turtle
, às vezes quando você executa isso, o desenho inteiro não está lá. No entanto, você pode ver que ele realmente funciona:fonte