Disegna la curva a punta di freccia Sierpinski


14

introduzione

La curva Arrowhead di Sierpinski è una curva che è il limite del triangolo di Sierpinski.

Innanzitutto inizia così:

 _
/ \

Quindi, ogni riga viene sostituita con una versione ruotata della prima:

  _
 / \
 \ /
_/ \_

Il prossimo:

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

Sierpinski Arrowhead Curve Evolution

Il tuo compito

Dato un numero n , uscita n iterazione -esimo del Sierpinski Arrowhead curva.

Puoi scegliere di indicizzare 0 o 1, ma specifica nella tua risposta.

Puoi generare un'immagine o utilizzare Ascii Art nel formato che ho sopra.

Non è possibile utilizzare i built-in per generare questa curva.

Ricorda, questo è , quindi vince il codice con il minor numero di byte.

Risposte:


14

Ottava, 240 236 221 byte

Questo è fatto con la stessa idea usata qui, ma ho dovuto cambiarlo per adattarlo alla curva della freccia 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

inserisci qui la descrizione dell'immagine


u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;è più breve di 16 byte :) Puoi anche fare axis off equalper salvare altri 5 byte.
Stewie Griffin,

3

Haskell + diagrammi, 176 byte

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

Crea un file svg con sfondo trasparente chiamato "a".

g 0genera una linea orizzontale, g 1è /¯\.

inserisci qui la descrizione dell'immagine


Fantastico, non lo sapevo Diagrams!
flawr

@flawr, è fantastico, ma si applicano le solite avvertenze sul programma grafico Haskell. Sarebbe bello chiamare semplicemente l'equivalente di di plot() aprire una finestra.
Angs

2

MSWLogo (Versione 6.5b), 102 byte

Accetta le due funzioni shapeL, shapeRfornite qui e le unisce aggiungendo un argomento in più :a, che chiama la funzione opposta quando negata.

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

Viene sdefinita una funzione , che richiede il numero di iterazioni :n(basate su 1), angolo :a, lunghezza :l. È ricorsivo, chiamando un'iterazione inferiore di se stesso con l'angolo :anegato in due casi per ottenere l'orientamento corretto.

  • rt :a, lt :aruota la tartaruga (triangolo del cui percorso è tracciato) a destra, a sinistra di :agradi.
  • fd :lsposta la tartaruga in avanti per :lpassi.

La funzione deve essere chiamata con :auguale a 60.

Punte di freccia

Qui, repeatè essenzialmente un ciclo FOR, con contatore incorporato repcount. pue pdsignifica "pen up" e "pen down", che impediscono alla tartaruga di disegnare mentre la sua posizione viene impostata usando setxy.

I disegni di ciascuna iterazione sono stati chiamati con lunghezza :luguale a power 2 (7-repcount), che diminuisce in modo esponenziale; questo perché la definizione usa lo stesso :lnella fase ricorsiva, quindi con fixed :lla dimensione complessiva dell'output aumenterà esponenzialmente con :n.


Questa è la lingua giusta per il lavoro, ma tecnicamente alle risposte non sono consentiti dati extra, quindi idealmente dovresti codificare i 60 nella tua risposta.
Neil,

@Neil Quindi includo solo 60nel conteggio dei byte?
u54112

Non sono sicuro che sia così semplice, ma non conosco la lingua da solo.
Neil,

1

Python 2, 124 byte

Basato sul codice nell'articolo di 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)

L'ordine 0 è una linea retta.


Devi modificare il codice per utilizzare un angolo di 60 gradi, altrimenti non si avvicina al triangolo Sierpinsky. Inoltre, l'orientamento cambia in base all'ordine, che non credo sia corretto. trinket.io/python/a803546939
mbomb007

La risposta al logo fornisce anche una funzione che accetta l'angolo come parametro, quindi penso che sia OK. Per quanto riguarda l'orientamento, è sempre la stessa curva, appena ruotata.
BookOwl,

La risposta del logo è sempre la stessa rotazione, però. La tua è una rotazione diversa per ogni ordine e non sono tutti uguali. Questo non va bene. Guarda le immagini contenute nella domanda.
mbomb007,

Dove dice la sfida che le rotazioni devono essere le stesse?
BookOwl,

1
Qualsiasi maggiore di matematica può dirti che un limite deve convergere. Il tuo no.
mbomb007,

1

Mathematica / Wolfram Lingua 73 byte

s=1;Region@Line@AnglePath[Nest[Join@@({#,s=-s,s}&/@#)&,{#~Mod~2},#]Pi/3]&

Spiegazione semplice :
AnglePath [{θ1, θ2, θ3, ...}] fornisce l'elenco di coordinate 2D corrispondenti a un percorso che inizia da {0,0}, quindi esegue una serie di passi di lunghezza unitaria ad angoli relativi successivi θi.

n = 1

Graphics@Line@AnglePath[60°{1,-1,-1}]

n = 2

Graphics@Line@AnglePath[60°{0,1,1, -1,-1,-1, -1,1,1}]

n = 3

Graphics@Line@AnglePath[60°{1,-1,-1, 1,1,1, 1,-1,-1, -1,1,1, -1,-1,-1, -1,1,1, -1,-1,-1, 1,1,1, 1,-1,-1}]

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


0

Mathematica, 62 byte

Graphics@Line@AnglePath[Pi/3Nest[Flatten@{-#,1,#,1,-#}&,0,#]]&

Come funziona?
BookOwl,

0

JavaScript (ES6), 180 byte

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>

Restituisce una matrice di stringhe. Ottenere la giusta spaziatura è stata la parte più difficile! Versione stringa pura per 205 byte:

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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.