Pentaflake'i Çiz


25

Öncelikle ... Herkese Mutlu Noeller diliyorum (saat diliminize geç kaldığım için üzgünüm).

Olayı kutlamak için bir kar tanesi çizeceğiz. Yıl 201 Çünkü 5 ve Noel 2 üzerindedir 5 (kişilerin büyük bir kısmı için) th, biz çekecek Penta pul. Pentaflake, beşgenlerden oluşan basit bir fraktaldır. İşte birkaç örnek (buradan alınacak) :görüntü tanımını buraya girin

Her Pentaflake'in bir n sırası vardır. 0 sırasındaki Pentaflake basitçe bir pentagondur. Diğer tüm siparişler için, bir Pentaflake, bir önceki siparişin 6. Pentaflake'i etrafına yerleştirilmiş olan önceki siparişin 5 Pentafinden oluşur. Örneğin, 1. sıradaki bir Pentaflake, merkezi bir pentagon etrafına yerleştirilmiş 5 penguenden oluşur.

Giriş

Sipariş n. Bu önceden tanımlanmış bir değişken dışında herhangi bir şekilde verilebilir.

Çıktı

nPentaflake siparişinin görüntüsü. En az 100 piksel genişliğinde ve 100 piksel uzunluğunda olmalıdır. Bir dosyaya kaydedilebilir, kullanıcıya gösterilebilir veya çıktısı alınabilir STDOUT. Başka herhangi bir çıkış şekline izin verilmez. Bu mücadeleden önce var olan tüm resim formatlarına izin verilir.

Kazanan

Codegolf olarak en az bayt sayısına sahip kişi kazanır.


3
-1 çünkü kar taneleri sadece 6 kat simetriye sahip! = D
kusur

@flawr Bu makaleye göre, sadece karelerin yaklaşık% 0,1'i aslında 6 kat simetriye ya da herhangi bir simetriye sahip. Ancak, simetriye sahip olan kar taneleri, 6 kat simetriye ek olarak 3 kat simetriye sahip olabilir: P
TheNumberOne

4
Peki, bu makale sadece tüm kar taneleri% 0.1 den daha az çalıştı ve sadece amerikan kar taneleri okudukları gibi, yine de anlamsız. Bahse girerim metrik kar taneleri daha simetriktir! (PS: Güzel görüntüler! Kar tanesi # 167 özellikle ilginç !) (Sadece metrik kar taneleri 10 kat simetriye sahip olmalıydı.)
kusur

1
Yukarıdaki yöntemlerden birini kullanarak çıktığı sürece tamam olacaktır. Ancak, nkomut dosyası dosyanızda önceden tanımlanamaz. Okuyabiliyorsun ndan STDIN... doğrudan kod katıştırma haricinde istediğiniz temelde bir şey, istemi, bu kullanıcıdan bir fonksiyon / commad satırı argümanı olarak götürün.
TheNumberOne

1
Bunu + 1'lemek istemem çünkü 25 :(
The_Basset_Hound

Yanıtlar:


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

Beşinci yineleme (zaten oluşturulması uzun zaman aldı).

görüntü tanımını buraya girin

Kodda küçük bir değişiklik (ne yazık ki daha fazla bayt) bu güzellikle sonuçlanır =)

görüntü tanımını buraya girin

Oh, ve diğeri:

görüntü tanımını buraya girin


Beni bu zorluğa yönlendirdiğin için teşekkür ederim, başka bir çözüm ekledim, umarım sakıncası yoktur;) Bayt sayınızdan güvenli bir şekilde uzaktayım, yine de, kaçırmak için çok ilginç buldum.
Andras Deak

7

Mathematica, 200 bayt

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

Son satır bir tam sayıya uygulanabilen bir fonksiyondur n.

Mathematica fonksiyon isimleri uzun. Birileri onları entropiye sokmalı ve ondan yeni bir dil yapmalı :)

Uygulandığında 1:

görüntü tanımını buraya girin

Uygulandığında 2:

görüntü tanımını buraya girin


6

MATLAB, 235 233 217 bayt

Güncelleme: @flawr'dan bir grup öneri 16 bayt kaybetmeme yardım etti. Ancak bu, kusurun çözümünü yenmeme izin verdiğinden ve kusurun yardımını almadan bu zorluğu ilk başıma bulamadığım için, bunu ortak bir görüşüm olarak kabul et :)

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

Bu başka bir MATLAB çözümüdür, yinelenen fonksiyon sistemleri felsefesine dayanır. Çoğunlukla algoritmanın kendisini geliştirmekle ilgileniyordum ve çözüm için çok fazla golf oynamıyorum. İyileştirme için kesinlikle yer var. (Sabit kodlu bir sabit nokta yaklaşımı kullanmayı düşündüm c, ama bu hoş olmazdı.)

Ungolfed versiyonu:

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

Sonucu N=5(sonradan bir axis equal offtitizlikle), ancak bayt saymadığımızı umuyorum:

N = 5 pentaflake


1
Bence birkaç bayttan tasarruf edersiniz R=[p(:,2),[-p(2,2);p(1,2)]];(ve öncekileri ortadan kaldırırsınız R,C,S) ve kullanabilirsiniz q=[q R^l*[c-1+t(1,:);t(2,:)]/c]ve düşünüyorum ve düşünüyorumc=1.5+5^.5/2;
kusur

@flawr açıkçası haklısın :) 1. rotasyon matrisi için teşekkürler, 2. yeni için teşekkürler q, hatta orada gereksiz bir parantez çifti vardı ... 3. teşekkürler, ama bu sihir nedir ??: D 4. çözüm artık orijinal belgenizden daha kısa olduğundan, bunun kısmen de sizin gönderiminiz olduğunu düşünüyorum.
Andras Deak

6

Mathematica, 124 bayt

Mathematica, Table10: sürümünden beri yeni bir sözdizimini desteklemektedir Table[expr, n]; Table[expr, n]eşittir 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}])

Bu fonksiyonun özü, tranformasyon yapmak için karmaşık sayıları kullanmak ve ardından onları noktalara dönüştürmek ReIm.

Test durumu:

f[4]

görüntü tanımını buraya girin


1
πUTF-8'de iki bayt alır, böylece toplamda 125 bayta çıkarsınız.
2012rcampion

OMFG bu nedir
DumpsterDoofus

3

Mathematica, 199 196 bayt

Peter Richter'ın cevabını bir saç tarafından kesmek. Grafik fonksiyonelliğine yoğun, matematik ve FP'ye daha az dayanıyor. CirclePoints yerleşimi 10.1'de yeni .

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

Düzenleme: GoldenRatio için DumpsterDoofus sayesinde


Sen değiştirerek 3 bayt kaydedebilirsiniz ((1+Sqrt@5)/2)ile GoldenRatio. Ayrıca ikinci satırda p@0=Polygon@c[{1,0},5];bunun yerine olması gerektiğini düşünüyorum p@0=Polygon@cp[{1,0},5];. (BTW Ben aslında Peter, iki profil lol var).
DumpsterDoofus

Evet! İyi arama. Ben de yazım hatasını tespit ettim ama düzeltmeyi unuttum. D'oh,
hYPotenuser

2

Mathematica, 130 bayt

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

Njpipeorgan'ın cevabına benzer bir teknik kullanıyorum (aslında 2Pi I/5 == Pi.4Ihilesini çaldım ), ancak özyinelemeli bir işlev olarak uygulandı.

Örnek kullanım ( %son satırda çıkarılan adsız fonksiyona erişmek için kullanılır ):

 %[5]

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.