Desenhar a curva da ponta de flecha de Sierpinski

14

Introdução

A curva de ponta de flecha de Sierpinski é uma curva que é o limite do triângulo de Sierpinski.

Começa assim:

 _
/ \

Em seguida, cada linha é substituída por uma versão rotacionada da primeira:

  _
 / \
 \ /
_/ \_

Próximo:

     _
    / \
    \ /
   _/ \_
  /     \
  \_   _/
 _  \ /  _
/ \_/ \_/ \

Evolução da curva de ponta de flecha de Sierpinski

Sua tarefa

Dado um número n , imprima a n- ésima iteração da curva de ponta de seta de Sierpinski.

Você pode optar pelo índice 0 ou 1, mas especifique na sua resposta.

Você pode gerar uma imagem ou usar o Ascii Art no formato acima.

Você não pode usar embutidos para gerar essa curva.

Lembre-se, isso é , então o código com o menor número de bytes vence.

Oliver Ni
fonte

Respostas:

14

Oitava, 240 236 221 bytes

Isso é feito com a mesma idéia usada aqui, mas tive que alterá-la para ajustar a curva da ponta de flecha de Sierpinsky.

m=input(0);g=2*pi/6;u=cos(g);v=sin(g);A=[1,0];B=[u,v];C=[-u,v];D=-A;E=-B;F=-C;for k=1:m;f=[E;F;A];b=[A;B;C];A=[B;A;F];d=[C;D;E];C=[D;C;B];E=[F;E;D];B=b;D=d;F=f;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

insira a descrição da imagem aqui

flawr
fonte
u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;é 16 bytes mais curto :) Você também pode axis off equalsalvar outros 5 bytes.
Stewie Griffin
3

Haskell + diagramas, 176 bytes

import Diagrams.Prelude
import Diagrams.Backend.SVG
g n=renderSVG"a"(mkWidth 99).strokeT.a n
a 0=hrule 1
a n|b<-a(n-1)=b%6<>b<>b%(-6);a%n=rotateBy(1/n).reflectY$a::Trail V2 Double

Cria um arquivo svg com fundo transparente chamado "a".

g 0produz uma linha horizontal, g 1é /¯\.

insira a descrição da imagem aqui

Angs
fonte
Ótimo, eu não sabia Diagrams!
flawr
@ flawr, é ótimo, mas as advertências usuais do programa gráfico Haskell se aplicam. Seria ótimo chamar o equivalente de plot() para abrir uma janela.
Angs
2

MSWLogo (Versão 6.5b), 102 bytes

Pega as duas funções shapeL, shapeRfornecidas aqui e as funde adicionando um argumento extra :a, que chama a função oposta quando negado.

to s :n :a :l
if :n=0[fd :l stop]
rt :a
s :n-1(-:a):l
lt :a
s :n-1 :a :l
lt :a
s :n-1(-:a):l
rt :a
end

sÉ definida uma função , que recebe várias iterações :n(com base em 1), ângulo :a, comprimento :l. É recursivo, chamando uma iteração mais baixa de si mesmo com o ângulo :anegado em duas instâncias para obter a orientação correta.

  • rt :a, lt :agire a tartaruga (triângulo cujo caminho é traçado) para a direita, deixada em :agraus.
  • fd :lmove a tartaruga para a frente em :letapas.

A função deve ser chamada com :aigual a 60.

Setas

Aqui, repeaté essencialmente um loop FOR, com contador embutido repcount. pue pdsignifica "caneta para cima" e "caneta para baixo", que impedem a tartaruga de desenhar enquanto sua posição está sendo definida setxy.

Os desenhos de cada iteração foram chamados com comprimento :ligual a power 2 (7-repcount), que diminui exponencialmente; isso ocorre porque a definição usa o mesmo :lna etapa recursiva, portanto, com fixo, :lo tamanho geral da saída aumentará exponencialmente com :n.

u54112
fonte
Esse é o idioma certo para o trabalho, mas tecnicamente as respostas não permitem dados extras; portanto, idealmente, você codificaria os 60 na sua resposta.
Neil
@ Neil Então, eu apenas incluo 60na contagem de bytes?
U54112
Não tenho certeza se é assim tão simples, mas eu não sei o idioma.
Neil
1

Python 2, 124 bytes

Baseado no código do artigo da Wikipedia.

from turtle import*
def c(o,a):
 if o:o-=1;c(o,-a);lt(a);c(o,a);lt(a);c(o,-a)
 else:fd(9)
n=input()
if n%2==0:lt(60)
c(n,60)

A ordem 0 é uma linha reta.

BookOwl
fonte
Você precisa alterar seu código para usar um ângulo de 60 graus, caso contrário não se aproximará do triângulo de Sierpinsky. Além disso, a orientação muda dependendo da ordem, o que não acho correto. Você pode
usar o seguinte
A resposta do logotipo também fornece uma função que assume o ângulo como parâmetro, então acho que está OK. Quanto à orientação, ainda é a mesma curva, apenas girada.
BookOwl
A resposta do logotipo é sempre a mesma rotação, no entanto. A sua rotação é diferente para cada pedido e eles não são todos iguais. Isso não está bem. Veja as fotos que a pergunta contém.
mbomb007
Onde o desafio diz que as rotações precisam ser as mesmas?
BookOwl
1
Qualquer especialista em matemática pode dizer que um limite deve convergir. O seu não.
mbomb007
0

Mathematica, 62 bytes

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&
alefalpha
fonte
Como isso funciona?
BookOwl
0

JavaScript (ES6), 180 bytes

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).map(s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l)).concat(f(n,d+1).map(s=>s+r(!(d%3))+a.shift(),a=f(n,d+2))):[`_/\\`[d%3]]
<input type=number min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>

Retorna uma matriz de strings. Conseguir o espaçamento correto foi a parte mais difícil! Versão de string pura para 205 bytes:

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).replace(/.+/g,s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l))+`\n`+f(n,d+1).replace(/.+/g,s=>s+r(!(d%3))+a.shift(),a=f(n,d+2).split`\n`):`_/\\`[d%3]
Neil
fonte