Gambarkan Pentaflake

25

Pertama-tama ... Saya ingin mengucapkan Selamat Hari Natal kepada semua orang (maaf jika saya terlambat satu hari untuk zona waktu Anda).

Untuk merayakannya, kita akan menggambar kepingan salju. Karena tahun adalah 201 5 dan Natal pada tanggal 2 5 (untuk sebagian besar orang), kita akan menggambar serpihan Penta . Pentaflake adalah fraktal sederhana yang terdiri dari segilima. Berikut adalah beberapa contoh (diambil dari sini) :masukkan deskripsi gambar di sini

Setiap Pentaflake memiliki pesanan n. Pentaflake orde 0 hanyalah sebuah pentagon. Untuk semua pesanan lain dan n, Pentaflake terdiri dari 5 Pentaflakes dari pesanan sebelumnya yang disusun sekitar Pentaflake ke-6 dari pesanan sebelumnya. Misalnya, Pentaflake pesanan 1 terdiri dari 5 pentagon yang disusun mengelilingi pentagon pusat.

Memasukkan

Pesanan n. Ini dapat diberikan dengan cara apa pun kecuali variabel yang sudah ditentukan sebelumnya.

Keluaran

Gambar ordo nPentaflake. Harus memiliki lebar minimal 100px dan panjang 100px. Ini dapat disimpan ke file, ditampilkan kepada pengguna, atau di-output ke STDOUT. Bentuk output lain apa pun tidak diizinkan. Semua format gambar yang ada sebelum tantangan ini diizinkan.

Kemenangan

Sebagai codegolf, orang dengan jumlah byte terkecil menang.

TheNumberOne
sumber
3
-1 karena kepingan salju hanya memiliki 6 simetri lipat! = D
flawr
@ flawr Menurut artikel ini hanya sekitar 0,1% dari kepingan salju sebenarnya memiliki simetri 6 kali lipat ... atau simetri sama sekali. Namun, kepingan salju yang memiliki simetri dapat memiliki simetri 3 kali lipat di samping simetri 6 kali lipat: P
TheNumberOne
4
Yah artikel ini hanya mempelajari kurang dari 0,1% dari semua kepingan salju, dan itu tidak berarti, karena mereka hanya mempelajari kepingan salju Amerika. Saya yakin kepingan salju metrik jauh lebih simetris! (PS: Gambar yang indah! Kepingan salju # 167 sangat menarik !) (Saya baru saja memperhatikan bahwa kepingan salju metrik pasti memiliki simetri 10 kali lipat.)
flawr
1
Ini akan baik-baik saja selama itu keluaran menggunakan salah satu metode di atas. Namun, ntidak dapat ditentukan sebelumnya dalam file skrip Anda. Anda dapat membaca ndari STDIN, meminta dari pengguna, menganggapnya sebagai argumen fungsi / garis komad ... pada dasarnya apa pun yang Anda inginkan kecuali untuk langsung menyematkannya dalam kode Anda.
TheNumberOne
1
Tidak ingin memberi ini +1 karena ini memiliki 25 :(
The_Basset_Hound

Jawaban:

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

Tidak Disatukan:

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

Iterasi kelima (sudah cukup lama untuk membuat).

masukkan deskripsi gambar di sini

Sedikit perubahan kode (sayangnya lebih banyak byte) menghasilkan keindahan ini =)

masukkan deskripsi gambar di sini

Oh, dan satu lagi:

masukkan deskripsi gambar di sini

cacat
sumber
Terima kasih telah menunjukkan tantangan ini kepada saya, saya pergi dan menambahkan solusi lain, harap Anda tidak keberatan;) Saya aman dari byte-count Anda, toh, saya merasa terlalu menarik untuk dilewatkan.
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],#]&

Baris terakhir adalah fungsi yang dapat diterapkan ke integer n.

Nama fungsi Mathematica panjang. Seseorang harus mem-encode mereka dan membuat bahasa baru darinya. :)

Ketika diterapkan ke 1:

masukkan deskripsi gambar di sini

Ketika diterapkan ke 2:

masukkan deskripsi gambar di sini

Peter Richter
sumber
6

MATLAB, 235 233 217 byte

Pembaruan: banyak saran dari @ flawr membantu saya kehilangan 16 byte. Karena hanya ini yang memungkinkan saya untuk mengalahkan solusi flawr , dan bahwa saya tidak akan menemukan tantangan tanpa bantuan flawr sejak awal, anggap ini pengajuan bersama oleh kami :)

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

Ini adalah solusi MATLAB lain, ini didasarkan pada filosofi sistem fungsi yang diulang. Saya sebagian besar tertarik untuk mengembangkan algoritma itu sendiri, dan saya belum terlalu banyak bermain golf pada solusinya. Pasti ada ruang untuk perbaikan. (Saya merenungkan menggunakan pendekatan fixed-point hard-coded untuk c, tapi itu tidak akan baik.)

Versi tidak disatukan:

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

Hasil untuk N=5(dengan axis equal offlanjutan untuk kecantikan, tapi saya harap itu tidak masuk hitungan byte-bijaksana):

N = 5 pentaflake

Andras Deak
sumber
1
Saya pikir Anda dapat menyimpan beberapa byte dengan menggunakan R=[p(:,2),[-p(2,2);p(1,2)]];(dan menghilangkan sebelumnya R,C,S) dan Anda dapat menggunakan q=[q R^l*[c-1+t(1,:);t(2,:)]/c]dan saya pikirc=1.5+5^.5/2;
flawr
@ flawr jelas Anda benar :) 1. terima kasih untuk matriks rotasi, 2. terima kasih untuk yang baru q, saya bahkan punya sepasang tanda kurung yang tidak perlu di sana ... 3. terima kasih, tapi sihir apa ini ??: D 4. karena solusinya sekarang lebih pendek dari aslinya, saya menganggap ini juga sebagian kiriman Anda.
Andras Deak
6

Mathematica, 124 byte

Mathematica mendukung sintaks baru Tablesejak versi 10 Table[expr, n]:, yang menyimpan byte lain. Table[expr, n]setara dengan 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}])

Inti dari fungsi ini adalah menggunakan bilangan kompleks untuk melakukan tranformasi dan kemudian mengubahnya menjadi poin ReIm.

Kasus cobaan:

f[4]

masukkan deskripsi gambar di sini

njpipeorgan
sumber
1
πmembutuhkan dua byte dalam UTF-8, jadi Anda menghasilkan total 125 byte.
Arcampion
OMFG apa ini
DumpsterDoofus
3

Mathematica, 199 196 byte

Mengatasi jawaban Peter Richter dengan sehelai rambut, inilah salah satu dari saya. Ini banyak bersandar pada fungsi grafis, dan lebih sedikit pada matematika dan FP. Built-in CirclePoints adalah baru dalam 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

Sunting: Terima kasih kepada DumpsterDoofus untuk GoldenRatio

hYPotenuser
sumber
Anda dapat menyimpan 3 byte dengan menggantinya ((1+Sqrt@5)/2)dengan GoldenRatio. Juga di baris kedua saya pikir itu seharusnya p@0=Polygon@c[{1,0},5];bukan p@0=Polygon@cp[{1,0},5];. (BTW saya sebenarnya Peter, saya punya dua profil lol).
DumpsterDoofus
Iya nih! Panggilan yang bagus. Saya melihat kesalahan ketik juga, tetapi lupa memperbaikinya. D'oh,
hYPotenuser
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

Saya menggunakan teknik yang mirip dengan jawaban njpipeorgan (sebenarnya saya mencuri 2Pi I/5 == Pi.4Itriknya), tetapi diimplementasikan sebagai fungsi rekursif.

Contoh penggunaan (gunakan %untuk mengakses fungsi anonim yang dihasilkan pada baris terakhir):

 %[5]

masukkan deskripsi gambar di sini

2012 Arcampion
sumber