Гольф Квітка життя


19

Завдання тут полягає в тому, щоб точно зобразити квітку життя (яка, на думку деяких, священна геометрична фігура) мовою, яку ви вибрали.

квітка життя

Конструкція складається з розташування кіл та часткових кіл радіусу 1, як показано, центри яких розташовані на трикутній сітці кроку 1 плюс один більший коло радіуса 3, що їх оточує.

Дизайн можна масштабувати так, як вам подобається, але дозволена максимальна помилка в 2% від математично правильної. Якщо використовувати растрову графіку, це ефективно обмежує діаметр невеликих кіл щонайменше приблизно на 100 пікселів.

Оскільки це код-гольф, виграє найкоротший код (байти).


10
Ласкаво просимо на сайт! Так що ви знаєте, зазвичай рекомендується почекати деякий час, перш ніж приймати відповідь, тому інші користувачі не сприйматимуть конкурс як "закінчений", і буде більше участі та конкуренції.
DJMcMayhem

2
"візуальний, впізнаваний і правильний" не є ні чітким, ні об'єктивним. Неможливо визначити, чи є подання дійсним без об’єктивних критеріїв дійсності. Ми рекомендуємо використовувати « Пісочницю» для розробки будь-яких потенційних проблем із викликами, перш ніж публікувати їх на головний сайт.
Мего

Крім такого абстрактного правила, як «впізнаваний», було б краще вказати мінімальний розмір.
манатура

Оскільки ніхто ще не підключив її, у нас є пісочниця на мета, яка створена, щоб допомогти новим викликам отримати зворотній зв'язок. Ви можете знайти його тут: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi

1
Це насправді не просто 19 гуртків. На краях також є кілька кругових дуг. (6 з них - кут 2π / 3, 12 - π, 18 - π / 6)
Мартін Ендер

Відповіді:


23

Математика, 177 173 128 124 120 байт

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}

введіть тут опис зображення

Основна ідея полягає в тому, щоб скласти результат із шести поворотних версій цього:

введіть тут опис зображення

Це в свою чергу прямокутна таблиця однакових дуг кола з відрізаними двома кутами. Якщо ми видалимо зріз і представляємо кожен центр кола з а #, ми, як правило, хочемо розподілити кола за цим шаблоном:

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

Ці краї відрізаються, встановивши умову -3 < x-y < 4на 2D-показники (оскільки значення x-yпостійних по діагоналях), і зсув походить від множення цих xта yнеортогональних векторів бази, що охоплюють сітку, яку ми шукаємо.

Ця конкретна орієнтація невратованих дуг виявляється найкоротшою, оскільки обидва кінці дуги рівномірно розділяються, Piтак що дуга може бути виражена як Pi/{6,2}(всі інші дуги вимагають або додаткових знаків мінусу чи цілих чисел у чисельнику).


Використовуйте √3, щоб зберегти 2 символи та 0 байт, усуваючи при цьому джерело числової помилки.
Келлі Лоудер

@KellyLowder Добре, фіксовано.
Мартін Ендер

8

OpenSCAD, 228 байт

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

Нижче наведена версія, що дозволяє комусь задавати параметри r (радіус) і w (ширина кілець).

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

Ця версія має чітко 246 символів.
Частина цього коду технічно непотрібна, але робить його більш схожим на малюнок.


Я отримую цю помилку на 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. Я не отримую цієї помилки, коли використовую фактичного клієнта OpenSCAD на своєму mac. Однак мені вдалося повторити цю помилку на OpenSCAD.net за допомогою хрому, що невтішно. Думаю, це питання щодо їх обслуговування. Чи можете ви спробувати настільний додаток?
Генрі Вілдермут

1
Працював для мене на настільній версії (Ubuntu 14.04 LTS).
Бенджамін Спектор

1
Я помітив зразок};} у вашому коді. Я думаю, ви могли б сміливо замінити це на}}, яке б погодило характер для обох версій. Випробував це сам і, здавалося, працює.
Бенджамін Спектор

6

Математика 263 байт

Не дуже конкурентоспроможний з поданням @ MartinEnder, але мені це було цікаво. Я дозволяю пелюсткам робити випадкову прогулянку! Пелюстка ходить, обертаючись на 60 градусів випадковим чином біля однієї з кінцевих точок, яка також вибрана випадковим чином. Я перевіряю, чи не обертається кінець пелюстки поза великим диском, і якщо так, обертання йде іншим шляхом.

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}]}

Ось наступний код, який я використав для анімації.

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}]]

Випадкова прогулянка пелюстками

Я десь прочитав, що двовимірні випадкові прогулянки повинні врешті повернутися до початку. Здається, що кілька тисяч кроків гарантують заповнення великого диска.


Це дійсно приємна ідея, але з кінцевою кількістю ітерацій також існує ненульова ймовірність не заповнити всю квітку. Вам, ймовірно, слід додати умову припинення після того, як ви намалювали 30 пелюсток (це здається найкоротшим способом визначити, чи дійсно ви готові). Тоді ви б знали, що малюнок робиться, коли ви припиняєте, і ймовірність того, що не припиняти, дорівнюватиме нулю.
Мартін Ендер

Незалежно від того, є багато байт ви можете зберегти: Sqrt[3]є 3^.5. Вам не потрібно визначати eдо першого використання, і ви можете використовувати цей трюк, щоб зберегти байт на ньому, так v={e=0{,},{0,2}}. Ви також можете використовувати позначення інфіксів, наприклад, e~c~6або e~Disk~6, і ArcTan@@Subtract@@vповинні бути еквівалентні ArcTan@@(#-#2)&@@v.
Мартін Ендер

Використовується infix, а також оператор √, щоб відголити 15 байт. Дякуємо за поради @MartinEnder. Позбувся / 2 та 2 *, які скасували. Є 180 пелюсток, тому 4 ^ 4 ітерації зазвичай охоплюють близько половини диска, а 5 ^ 5 виконує завдання. Ймовірність того, що 9 ^ 9 не охопить диск, становить ~ 1 з 10 ^ 400 000, що набагато менше 2% помилок, тому не варто перевіряти витрачені байти.
Келлі Лоудер

3

JavaScript (ES6) / SVG, 299 байт

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) />`)}

Працює, генеруючи кілька пар дуг різної довжини, потім обертаючи їх на місце.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.