Disegna il Pentaflake


25

Prima di tutto ... vorrei augurare a tutti un buon Natale (scusate se sono in ritardo di un giorno per il vostro fuso orario).

Per celebrare l'occasione, disegneremo un fiocco di neve. Poiché l'anno è 201 5 e Natale è il 2 5 (per una grande parte di persone), disegneremo un fiocco Penta . Il Pentaflake è un semplice frattale composto da pentagoni. Ecco alcuni esempi (presi da qui) :inserisci qui la descrizione dell'immagine

Ogni Pentaflake ha un ordine n. Il Pentaflake di ordine 0 è semplicemente un pentagono. Per tutti gli altri ordini n, un Pentaflake è composto da 5 Pentaflakes dell'ordine precedente disposti attorno a un 6 ° Pentaflake dell'ordine precedente. Ad esempio, un Pentaflake di ordine 1 è composto da 5 pentagoni disposti attorno a un pentagono centrale.

Ingresso

L'ordine n. Questo può essere dato in qualsiasi modo tranne quello di una variabile predefinita.

Produzione

Un'immagine dell'ordine di nPentaflake. Deve essere largo almeno 100 px e lungo 100 px. Può essere salvato in un file, visualizzato all'utente o inviato aSTDOUT . Non è consentita qualsiasi altra forma di output. Sono ammessi tutti i formati di immagine esistenti prima di questa sfida.

vincente

Come codegolf, vince la persona con il minor numero di byte.


3
-1 perché i fiocchi di neve hanno solo 6 volte simmetria! = D
flawr

@flawr Secondo questo articolo solo circa l'1% dei fiocchi di neve ha in realtà una simmetria 6 volte ... o qualsiasi simmetria. Tuttavia, quei fiocchi di neve che hanno la simmetria possono avere una simmetria
tripla

4
Bene, questo articolo ha studiato solo meno dell'1% di tutti i fiocchi di neve, ed è comunque insignificante, poiché hanno studiato solo fiocchi di neve americani. Scommetto che i fiocchi di neve metrici sono molto più simmetrici! (PS: Belle immagini! Il fiocco di neve n. 167 è particolarmente interessante !) (Ho appena notato che i fiocchi di neve metrici devono avere una simmetria di 10 volte.)
flawr

1
Andrà bene finché emetterà uno dei metodi sopra indicati. Tuttavia, nnon può essere predefinito nel file di script. Si può leggere nda STDIN, pronta esso da parte dell'utente, lo prendo come un argomento della riga di funzione / commad ... praticamente tutto quello che vuoi, tranne per l'incorporamento direttamente nel codice.
TheNumberOne il

1
Non voglio fare +1 per questo perché ha 25 :(
The_Basset_Hound

Risposte:


14

Matlab, 226

function P(M);function c(L,X,Y,O);hold on;F=.5+5^.5/2;a=2*pi*(1:5)/5;b=a(1)/2;C=F^(2*L);x=cos(a+O*b)/C;y=sin(a+O*b)/C;if L<M;c(L+1,X,Y,~O);for k=1:5;c(L+1,X+x(k),Y+y(k),O);end;else;fill(X+x*F, Y+y*F,'k');end;end;c(0,0,0,0);end

Ungolfed:

function P(M);                
function c(L,X,Y,O);          %recursive function
hold on;
F=.5+5^.5/2;                  %golden ratio
a=2*pi*(1:5)/5;               %full circle divided in 5 parts (angles)
b=a(1)/2;
C=F^(2*L);
x=cos(a+O*b)/C;               %calculate the relative position ofnext iteration
y=sin(a+O*b)/C;
if L<M;                       %current recursion (L) < Maximum (M)? recurse
    c(L+1,X,Y,~O);            %call recursion for inner pentagon
    for k=1:5;
        c(L+1,X+x(k),Y+y(k),O)%call recursion for the outer pentagons
    end; 
else;                         %draw
    fill(X+x*F, Y+y*F,'k');  
end;
end;
c(0,0,0,0);
end

Quinta iterazione (il rendering ha già richiesto parecchio tempo).

inserisci qui la descrizione dell'immagine

Una leggera alterazione del codice (purtroppo più byte) si traduce in questa bellezza =)

inserisci qui la descrizione dell'immagine

Oh, e un altro:

inserisci qui la descrizione dell'immagine


Grazie per avermi indicato questa sfida, sono andato e ho aggiunto un'altra soluzione, spero non ti dispiaccia;) Sono al sicuro lontano dal tuo conteggio dei byte, comunque, ho trovato troppo interessante perdere.
Andras Deak,

7

Mathematica, 200 byte

a=RotationTransform
b=Range
r@k_:={Re[t=I^(4k/5)],Im@t}
R@k_:=a[Pi,(r@k+r[k+1])/2]
Graphics@Nest[GeometricTransformation[#,ScalingTransform[{1,1}(Sqrt@5-3)/2]@*#&/@Append[R/@b@5,a@0]]&,Polygon[r/@b@5],#]&

L'ultima riga è una funzione che può essere applicata a un numero intero n .

I nomi delle funzioni di Mathematica sono lunghi. Qualcuno dovrebbe codificarli con entropia e trarne una nuova lingua. :)

Quando applicato a 1:

inserisci qui la descrizione dell'immagine

Quando applicato a 2:

inserisci qui la descrizione dell'immagine


6

MATLAB, 235 233 217 byte

Aggiornamento: alcuni suggerimenti di @flawr mi hanno aiutato a perdere 16 byte. Dal momento che solo questo mi ha permesso di battere la soluzione di Flawr e che non avrei trovato la sfida senza l'aiuto di Flawr in primo luogo, considera questa una proposta comune da parte nostra :)

N=input('');f=2*pi/5;c=1.5+5^.5/2;g=0:f:6;p=[cos(g);sin(g)];R=[p(:,2),[-p(2,2);p(1,2)]];for n=1:N,t=p;q=[];for l=0:4,q=[q R^l*[c-1+t(1,:);t(2,:)]/c];end,p=[q -t/c];end,p=reshape(p',5,[],2);fill(p(:,:,1),p(:,:,2),'k');

Questa è un'altra soluzione MATLAB, questa basata su una filosofia di sistemi di funzioni iterate. Ero principalmente interessato a sviluppare l'algoritmo stesso e non ho giocato troppo sulla soluzione. C'è sicuramente spazio per miglioramenti. (Ho pensato di usare un'approssimazione a punto fisso codificata perc , ma non sarebbe carino.)

Versione non golfata:

N=input('');                                % read order from stdin

f=2*pi/5;                                   % angle of 5-fold rotation
c=1.5+5^.5/2;                               % scaling factor for contraction

g=0:f:6;
p=[cos(g);sin(g)];                          % starting pentagon, outer radius 1
R=[p(:,2),[-p(2,2);p(1,2)]];                % 2d rotation matrix with angle f

for n=1:N,                                  % iterate the points
    t=p;
    q=[];
    for l=0:4,
       q=[q R^l*[c-1+t(1,:);t(2,:)]/c];     % add contracted-rotated points
    end,
    p=[q -t/c];                             % add contracted middle block
end,

p=reshape(p',5,[],2);                 % reshape to 5x[]x2 matrix to separate pentagons
fill(p(:,:,1),p(:,:,2),'k');          % plot pentagons

Risultato per N=5(con un successivo axis equal offper la bellezza, ma spero che non conti byte-saggio):

N = 5 pentaflake


1
Penso che potresti risparmiare qualche byte usando R=[p(:,2),[-p(2,2);p(1,2)]];(ed eliminando il precedente R,C,S) e puoi usare q=[q R^l*[c-1+t(1,:);t(2,:)]/c]e pensoc=1.5+5^.5/2;
flawr

@flawr ovviamente hai ragione :) 1. grazie per la matrice di rotazione, 2. grazie per la nuova q, ho anche avuto una coppia di parentesi inutili ... 3. grazie, ma cos'è questa magia ??: D 4. dal momento che la soluzione è ora più breve del tuo originale, ritengo che questo sia in parte anche il tuo contributo.
Andras Deak,

6

Mathematica, 124 byte

Mathematica supporta la nuova sintassi per la Tableversione 10: Table[expr, n]che salva un altro byte. Table[expr, n]è equivalente a Table[expr, {n}].

f@n_:=(p=E^Array[π.4I#&,5];Graphics@Map[Polygon,ReIm@Fold[{g,s}~Function~Join[.62(.62g#+#&/@s),{-.39g}],p,p~Table~n],{-3}])

Il nucleo di questa funzione sta usando numeri complessi per fare trasformazioni e poi convertirle in punti ReIm .

Caso di prova:

f[4]

inserisci qui la descrizione dell'immagine


1
πoccupa due byte in UTF-8, quindi si esce a 125 byte in totale.
Campion 2012

OMFG cos'è questo
DumpsterDoofus

3

Mathematica, 199 196 byte

Mettendo da parte la risposta di Peter Richter, eccone una mia. Si appoggia fortemente sulla funzionalità grafica e meno su matematica e FP. Il CirclePoints integrato è nuovo in 10.1 .

c=CirclePoints;g=GeometricTransformation;
p@0=Polygon@c[{1,0},5];
p@n_:=GraphicsGroup@{
        p[n-1],
        g[
          p[n-1]~g~RotationTransform[Pi/5],
          TranslationTransform/@{GoldenRatio^(2n-1),n*Pi/5}~c~5
        ]
      };
f=Graphics@*p

Modifica: grazie a DumpsterDoofus per GoldenRatio


È possibile salvare 3 byte sostituendoli ((1+Sqrt@5)/2)con GoldenRatio. Anche nella seconda riga penso che dovrebbe essere p@0=Polygon@c[{1,0},5];invece di p@0=Polygon@cp[{1,0},5];. (A proposito, in realtà sono Peter, ho due profili lol).
DumpsterDoofus,

Sì! Buona chiamata. Anch'io ho notato l'errore di battitura, ma ho dimenticato di risolverlo. D'oh,
hYPotenuser il

2

Mathematica, 130 byte

r=Exp[Pi.4I Range@5]
p=1/GoldenRatio
f@0={r}
f@n_:=Join@@Outer[1##&,r,p(f[n-1]p+1),1]~Join~{-f[n-1]p^2}
Graphics@*Polygon@*ReIm@*f

Uso una tecnica simile alla risposta di njpipeorgan (in effetti ho rubato il suo 2Pi I/5 == Pi.4Itrucco), ma implementato come una funzione ricorsiva.

Esempio di utilizzo (utilizzo %per accedere alla funzione anonima che è stata emessa sull'ultima riga):

 %[5]

inserisci qui la descrizione dell'immagine

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.