Golf Bunga Kehidupan

19

Tantangannya di sini adalah menggambarkan bunga kehidupan secara akurat (yang menurut beberapa tokoh geometri suci) dalam bahasa pilihan Anda.

bunga kehidupan

Desain terdiri dari susunan lingkaran dan lingkaran parsial dari jari-jari 1 seperti yang diperlihatkan pusat-pusatnya tersusun pada kisi segitiga 1, ditambah satu lingkaran lebih besar dari jari-jari 3 yang mengelilinginya.

Desain dapat diskalakan sesuai keinginan Anda, tetapi kesalahan maksimal 2% dari koreksi matematis diizinkan. Jika menggunakan grafik raster, ini secara efektif membatasi diameter lingkaran kecil setidaknya 100 piksel.

Karena ini adalah kode-golf, kode terpendek (byte) menang.

Benjamin Spector
sumber
10
Selamat datang di situs ini! Asal tahu saja, umumnya disarankan untuk menunggu sebentar sebelum menerima jawaban, sehingga pengguna lain tidak akan melihat kontes sebagai "berakhir", dan akan ada lebih banyak partisipasi dan kompetisi.
DJMcMayhem
2
"visual, dapat dikenali, dan benar" tidak jelas atau objektif. Tidak mungkin untuk menentukan apakah suatu pengajuan valid atau tidak tanpa kriteria validitas objektif. Kami menganjurkan penggunaan Sandbox untuk mengatasi potensi masalah dengan tantangan sebelum mempostingnya ke situs utama.
Mego
Selain aturan abstrak seperti "dikenali", akan lebih baik untuk menentukan ukuran minimum.
manatwork
Karena belum ada yang menancapkannya, kami memiliki kotak pasir di meta yang dirancang untuk membantu tantangan baru mendapatkan umpan balik. Anda dapat menemukannya di sini: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi
1
Sebenarnya bukan hanya 19 lingkaran. Ada beberapa busur lingkaran di bagian tepi juga. (6 dari mereka yang memiliki sudut 2π / 3, 12 yang menutupi π, 18 yang menutupi π / 6)
Martin Ender

Jawaban:

23

Mathematica, 177 173 128 124 120 byte

c=Circle;Graphics@{{0,0}~c~3,Rotate[Table[If[-3<x-y<4,c[{√3x,-x+2y}/2,1,Pi/{6,2}]],{x,-3,2},{y,-4,2}],Pi/3#]&~Array~6}

masukkan deskripsi gambar di sini

Gagasan utamanya adalah menyusun hasil dari enam versi yang dirotasi ini:

masukkan deskripsi gambar di sini

Ini pada gilirannya adalah tabel persegi panjang dari lingkaran lingkaran identik dengan dua sudut terpotong. Jika kami menghapus geser dan mewakili setiap pusat lingkaran dengan #, kami pada dasarnya ingin mendistribusikan lingkaran dalam pola ini:

####
#####
######
######
 #####
  ####

Tepi-tepi ini terpotong dengan memaksakan kondisi -3 < x-y < 4pada indeks 2D (karena nilai x-ykonstan diagonal) dan geser berasal dari mengalikan ini xdan ydengan vektor basis non-ortogonal yang menjangkau grid yang kita cari.

Orientasi khusus dari busur yang tidak diputar ini ternyata menjadi yang terpendek karena kedua ujung busur membagi secara merata Pisehingga busur dapat dinyatakan sebagai Pi/{6,2}(semua busur lainnya akan memerlukan dan tambahan tanda minus atau bilangan bulat dalam pembilang).

Martin Ender
sumber
Gunakan √3 untuk menyimpan 2 karakter & 0 byte, sambil menghilangkan sumber kesalahan numerik.
Kelly Lowder
@KellyLowder Poin bagus, diperbaiki.
Martin Ender
8

OpenSCAD, 228 byte

$fn=99;module o(a=9){difference(){circle(a);circle(a-1);}}function x(n)=9*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o();q(g-1);}}else{intersection(){translate(x(i))o();circle(9);}}}q(2);o(27);

Di bawah ini adalah versi yang memungkinkan seseorang untuk mengatur parameter r (radius) dan w (lebar cincin).

r=1;w=.1;$fn=99;module o(n){difference(){circle(n);circle(n-w);}}function x(n)=(r-w/2)*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o(r);q(g-1);}}else{intersection(){translate(x(i))o(r);circle(r);}}}q(2);o(3*r-w);

Versi ini benar-benar 246 karakter.
Beberapa kode ini secara teknis tidak perlu tetapi membuatnya lebih mirip gambar.

Henry Wildermuth
sumber
Saya mendapatkan kesalahan ini di OpenSCAD.net (Firefox 47): Error: Error: Parse error on line 1: ...x(k))o();circle(9);};}}}q(2);o(27); -----------------------^ Expecting 'TOK_ID', '}', 'TOK_IF', '!', '#', '%', '*', got ';'
HyperNeutrino
@AlexL. Saya tidak mendapatkan kesalahan itu ketika saya menggunakan klien OpenSCAD pada mac saya. Namun saya bisa meniru kesalahan itu di OpenSCAD.net menggunakan chrome, yang mengecewakan. Itu pikir ini masalah dengan layanan mereka. Bisakah Anda mencoba aplikasi desktop?
Henry Wildermuth
1
Bekerja untuk saya pada versi desktop (Ubuntu 14.04 LTS).
Benjamin Spector
1
Saya perhatikan pola};} dalam kode Anda. Saya pikir Anda dapat dengan aman menggantinya dengan}} yang akan mencukur karakter untuk kedua versi. Mengujinya sendiri dan sepertinya berhasil.
Benjamin Spector
6

Mathematica 263 Bytes

Tidak benar-benar kompetitif dengan pengajuan @ MartinEnder tapi saya senang dengan ini. Aku membiarkan kelopaknya berjalan secara acak! Kelopak berjalan dengan memutar 60 derajat secara acak tentang salah satu titik akhir yang juga dipilih secara acak. Saya menguji untuk melihat apakah ujung kelopak yang berputar jatuh di luar piringan besar, dan jika demikian, putarannya sebaliknya.

c=Circle;a=√3;v={e=0{,},{0,2}};f=RandomChoice;Graphics@{e~c~6,Table[q=f@{1,2};t=f@{p=Pi/3,-p};r=RotationTransform[#,v[[q]]]&;v=r[If[r[t]@v[[-q]]∈e~Disk~6,t,-t]]@v;Translate[Rotate[{c[{1,a},2,p{4,5}],c[{1,-a},2,p{1,2}]},ArcTan@@(#-#2)&@@v,e],v[[2]]],{5^5}]}

Berikut adalah kode selanjutnya yang saya gunakan untuk animasi.

Export[NotebookDirectory[]<>"flower.gif", Table[Graphics[Join[{c[e,6]},(List@@%)[[1,2,1;;n-1]],{Thick,Red,(List@@%)[[1,2,n]]}]],{n,1,3^4,1}]]

Jalan Petal Acak

Saya membaca di suatu tempat bahwa jalan acak 2 dimensi akhirnya harus kembali ke asal. Sepertinya beberapa ribu langkah menjamin pengisian disk besar.

Kelly Lowder
sumber
Ini adalah ide yang sangat bagus, tetapi dengan jumlah iterasi yang terbatas juga ada kemungkinan nol untuk tidak mengisi seluruh bunga. Anda mungkin harus menambahkan kondisi terminasi setelah Anda menggambar 30 kelopak (yang sepertinya cara terpendek untuk menentukan apakah Anda benar-benar selesai). Maka Anda akan tahu gambar dilakukan ketika Anda mengakhiri, dan probabilitas tidak mengakhiri akan menjadi nol.
Martin Ender
Terlepas dari itu, ada banyak byte yang bisa Anda simpan: Sqrt[3]is 3^.5. Anda tidak perlu mendefinisikan esampai penggunaan pertama dan Anda dapat menggunakan trik ini untuk menyimpan byte di dalamnya, jadi v={e=0{,},{0,2}}. Anda juga dapat menggunakan beberapa notasi infiks seperti e~c~6atau e~Disk~6, dan ArcTan@@Subtract@@vharus setara dengan ArcTan@@(#-#2)&@@v.
Martin Ender
Digunakan infiks dan juga operator √ untuk memotong 15 byte. Terima kasih atas tipsnya @MartinEnder. Singkirkan / 2 dan 2 * yang dibatalkan. Ada 180 kelopak sehingga iterasi 4 ^ 4 biasanya mencakup sekitar setengah dari disk, dan 5 ^ 5 melakukan pekerjaan. Probabilitas 9 ^ 9 tidak mencakup disk adalah ~ 1 dari 10 ^ 400.000 yang merupakan kesalahan kurang dari 2%, jadi tidak layak untuk memeriksa byte yang terbuang.
Kelly Lowder
3

JavaScript (ES6) / SVG, 299 byte

with(document){write(`<svg height=250 width=250><circle${b=` fill=none stroke=black `}cx=125 cy=125 r=120 />`);for(i=0;i<24;i++)write(`<path${b}d=M5,125${`${a=`a60,60,0,0,1,`}40,0`.repeat(i%4+3)+`${a}-40,0`.repeat(i%4+3)} transform=${`rotate(60,125,125)`.repeat(i>>2)}rotate(-60,${i%4*4}5,125) />`)}

Bekerja dengan menghasilkan beberapa pasangan busur dari berbagai panjang kemudian memutarnya ke tempatnya.

Neil
sumber