Narysuj Pentaflake

25

Po pierwsze ... chciałbym wszystkim życzyć Wesołych Świąt (przepraszam, jeśli spóźnię się o strefę czasową).

Aby uczcić tę okazję, narysujemy płatek śniegu. Ponieważ jest rok 201 5, a Boże Narodzenie przypada na 2 5 (dla dużej części osób), losujemy płatek Penta . Pentaflake to prosty fraktal złożony z pięciokątów. Oto kilka przykładów (wziętych stąd) :wprowadź opis zdjęcia tutaj

Każdy Pentaflake ma porządek n. Pentaflake rzędu 0 jest po prostu pięciokątem. Dla wszystkich innych zamówień n, Pentaflake składa się z 5 Pentaflake z poprzedniego rzędu ułożonych wokół 6. Pentaflake z poprzedniego rzędu. Na przykład Pentaflake rzędu 1 składa się z 5 pięciokątów rozmieszczonych wokół centralnego pięciokąta.

Wkład

Porządek n. Można to podać w dowolny sposób poza zmienną predefiniowaną.

Wydajność

Obraz zamówienia nPentaflake. Musi mieć co najmniej 100 pikseli szerokości i 100 pikseli długości. Może być zapisany w pliku, wyświetlony użytkownikowi lub wysłany do STDOUT. Wszelkie inne formy wyników są niedozwolone. Wszystkie formaty obrazów istniejące przed tym wyzwaniem są dozwolone.

Zwycięski

Jako codegolf wygrywa osoba z najmniejszą liczbą bajtów.

Numer jeden
źródło
3
-1, ponieważ płatki śniegu mają tylko 6-krotną symetrię! = D
wada
@flawr Zgodnie z tym artykułem tylko około .1% płatków śniegu ma 6-krotną symetrię ... lub dowolną symetrię. Jednak te płatki śniegu, które mają symetrię, mogą mieć 3-krotną symetrię oprócz 6-krotnej symetrii: P
TheNumberOne
4
Cóż, w tym artykule badano tylko o mniej niż 0,1% wszystkich płatków śniegu, i i tak jest bez znaczenia, ponieważ badali tylko amerykańskie płatki śniegu. Założę się, że metryczne płatki śniegu są o wiele bardziej symetryczne! (PS: Piękne obrazy! Płatek śniegu # 167 jest szczególnie interesujący !) (Właśnie zauważyłem, że metryczne płatki śniegu muszą mieć 10-krotną symetrię.)
flawr
1
Będzie w porządku, o ile będzie generowany przy użyciu jednej z powyższych metod. Nie nmożna go jednak wstępnie zdefiniować w pliku skryptu. Można odczytać nz STDIN, szybka ono od użytkownika, należy przyjąć ją jako funkcja / commad linii argumentacji ... w zasadzie wszystko, co chcesz z wyjątkiem bezpośrednio osadzenie go w kodzie.
TheNumberOne
1
Nie chcę
dawać

Odpowiedzi:

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

Nie golfowany:

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

Piąta iteracja (renderowanie zajęło już sporo czasu).

wprowadź opis zdjęcia tutaj

Niewielka zmiana kodu (niestety więcej bajtów) powoduje, że to piękno =)

wprowadź opis zdjęcia tutaj

Aha i jeszcze jedno:

wprowadź opis zdjęcia tutaj

wada
źródło
Dzięki za wskazanie mi tego wyzwania, poszedłem i dodałem inne rozwiązanie, mam nadzieję, że nie masz nic przeciwko;) Jestem bezpieczny z dala od twojej liczby bajtów, w każdym razie, po prostu uznałem to za zbyt interesujące, aby je przegapić.
Andras Deak,
7

Mathematica, 200 bajtów

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],#]&

Ostatni wiersz jest funkcją, którą można zastosować do liczby całkowitej n.

Nazwy funkcji matematycznych są długie. Ktoś powinien je zakodować entropijnie i stworzyć z niego nowy język. :)

Po zastosowaniu do 1:

wprowadź opis zdjęcia tutaj

Po zastosowaniu do 2:

wprowadź opis zdjęcia tutaj

Peter Richter
źródło
6

MATLAB, 235 233 217 bajtów

Aktualizacja: kilka sugestii z @flawr pomogło mi stracić 16 bajtów. Ponieważ tylko to pozwoliło mi pokonać rozwiązanie flawr i że nie znalazłbym wyzwania bez pomocy flawr w pierwszej kolejności, rozważ to jako wspólne zgłoszenie :)

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');

To kolejne rozwiązanie MATLAB oparte na filozofii iterowanych systemów funkcyjnych. Byłem najbardziej zainteresowany opracowaniem samego algorytmu i nie grałem zbyt dużo w rozwiązanie. Z pewnością jest miejsce na ulepszenia. (Rozważałem użycie zakodowanego na stałe przybliżenia dla punktu stałego c, ale to nie byłoby miłe.)

Wersja bez golfa:

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

Wynik dla N=5(z kolejnym axis equal offdla ładności, ale mam nadzieję, że to się nie liczy bajtowo):

N = 5 pentaflake

Andras Deak
źródło
1
Myślę, że możesz zaoszczędzić kilka bajtów, używając R=[p(:,2),[-p(2,2);p(1,2)]];(i eliminując poprzednie R,C,S) i możesz użyć q=[q R^l*[c-1+t(1,:);t(2,:)]/c]i myślęc=1.5+5^.5/2;
flawr
@ flawr oczywiście masz rację :) 1. dzięki za matrycę rotacji, 2. dzięki za nowy q, miałem nawet niepotrzebną parę nawiasów ... 3. dzięki, ale co to za magia ??: D 4. ponieważ rozwiązanie jest teraz krótsze niż oryginał, uważam, że jest to częściowo również przesłanie.
Andras Deak
6

Mathematica, 124 bajty

Mathematica obsługuje nową składnię Tableod wersji 10 Table[expr, n]:, która oszczędza kolejny bajt. Table[expr, n]jest równoważne z 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}])

Rdzeniem tej funkcji jest używanie liczb zespolonych do wykonywania transformacji, a następnie przekształcanie ich w punkty o ReIm.

Przypadek testowy:

f[4]

wprowadź opis zdjęcia tutaj

njpipeorgan
źródło
1
πzajmuje dwa bajty w UTF-8, więc wychodzisz do 125 bajtów ogółem.
2012rcampion
OMFG co to jest
DumpsterDoofus
3

Mathematica, 199 196 bajtów

Kończąc włosami odpowiedź Petera Richtera, oto moja własna. Opiera się głównie na funkcjonalności grafiki, a mniej na matematyce i FP. Wbudowane CirclePoints jest nowe w 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

Edycja: Dzięki DumpsterDoofus dla GoldenRatio

hYPotenuser
źródło
Możesz zapisać 3 bajty, zastępując ((1+Sqrt@5)/2)je GoldenRatio. Również w drugim wierszu myślę, że powinno być p@0=Polygon@c[{1,0},5];zamiast p@0=Polygon@cp[{1,0},5];. (BTW Jestem właściwie Peter, mam dwa profile lol).
DumpsterDoofus
Tak! Dobra decyzja. Zauważyłem też literówkę, ale zapomniałem ją naprawić. D'oh,
hYPotenuser
2

Mathematica, 130 bajtów

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

Używam techniki podobnej do odpowiedzi njpipeorgan (w rzeczywistości ukradłem jego 2Pi I/5 == Pi.4Isztuczkę), ale zaimplementowałem ją jako funkcję rekurencyjną.

Przykładowe użycie (użycie w %celu uzyskania dostępu do funkcji anonimowej, która została wyprowadzona w ostatniej linii):

 %[5]

wprowadź opis zdjęcia tutaj

2012 rcampion
źródło