Гольф Цветок Жизни


19

Задача здесь состоит в том, чтобы точно изобразить цветок жизни (который, по некоторым данным, является священной геометрической фигурой) на выбранном вами языке.

цветок жизни

Конструкция состоит из расположения окружностей и частичных окружностей радиуса 1, как показано, центры которых расположены на треугольной сетке с шагом 1, плюс один большой круг радиуса 3, окружающий их.

Дизайн можно масштабировать по своему усмотрению, но допускается максимальная ошибка 2% от математически правильной. При использовании растровой графики это эффективно ограничивает диаметр маленьких кружков, по крайней мере, до 100 пикселей.

Поскольку это код-гольф, выигрывает самый короткий код (байты).


10
Добро пожаловать на сайт! Точно так же, как вы знаете, обычно рекомендуется подождать некоторое время, прежде чем принять ответ, таким образом, другие пользователи не будут видеть конкурс «оконченным», и будет больше участия и конкуренции.
DJMcMayhem

2
«визуальный, узнаваемый и правильный» не является ни ясным, ни объективным. Невозможно определить, является ли представление действительным без объективных критериев достоверности. Мы рекомендуем использовать Песочницу для решения любых потенциальных проблем с проблемами до их публикации на главном сайте.
Мего

Помимо такого абстрактного правила, как «узнаваемый», было бы лучше указать минимальный размер.
manatwork

Поскольку никто еще не подключил его, у нас есть «песочница» в мета-версии, которая разработана, чтобы помочь новым вызовам получить обратную связь. Вы можете найти его здесь: meta.codegolf.stackexchange.com/questions/2140/...
tuskiomi

1
Это на самом деле не просто 19 кругов. По краям также есть несколько дуг окружности. (6 из них покрывают угол 2π / 3, 12 - π, 18 - π / 6)
Мартин Эндер

Ответы:


23

Mathematica, 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}

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

Основная идея состоит в том, чтобы составить результат из шести повернутых версий этого:

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

Это, в свою очередь, прямоугольный стол из одинаковых дуг окружности с отрезанными двумя углами. Если мы уберем сдвиг и представим каждый центр окружности с помощью a #, мы в основном хотим распределить окружности по этой схеме:

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

Эти ребра обрезаются путем наложения условия -3 < x-y < 4на двумерные индексы (так как значение 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 с помощью Chrome, что разочаровывает. Кажется, это проблема их обслуживания. Не могли бы вы попробовать настольное приложение?
Генри Вильдермут

1
У меня работало на настольной версии (Ubuntu 14.04 LTS).
Бенджамин Спектор

1
Я заметил шаблон};} в вашем коде. Я думаю, вы могли бы смело заменить это на}}, что выбрило бы символ для обеих версий. Протестировал сам и вроде как работает.
Бенджамин Спектор

6

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

Случайная прогулка лепестков

Я где-то читал, что 2-мерные случайные блуждания должны в конечном итоге вернуться к началу координат. Кажется, несколько тысяч шагов гарантируют заполнение большого диска.


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

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

Использовал инфикс, а также оператор √, чтобы сбрить 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.