Golfing Flower of Life

19

El desafío aquí es representar con precisión la flor de la vida (que según algunos es una figura geométrica sagrada) en el idioma que elija.

la flor de la vida

El diseño consiste en una disposición de círculos y círculos parciales de radio 1, como se muestra, cuyos centros están dispuestos en una cuadrícula triangular de paso 1, más un círculo más grande de radio 3 que los rodea.

El diseño se puede escalar a su gusto, pero se permite un error máximo del 2% de matemáticamente correcto. Si usa gráficos de trama, esto limita efectivamente el diámetro de los círculos pequeños a al menos aproximadamente 100 píxeles.

Como se trata de código de golf, gana el código más corto (bytes).

Benjamin Spector
fuente
10
Bienvenido al sitio! Para que lo sepas, generalmente se recomienda esperar un tiempo antes de aceptar una respuesta, de esa manera otros usuarios no verán el concurso como "terminado", y habrá más participación y competencia.
DJMcMayhem
2
"visual, reconocible y correcto" no es claro ni objetivo. Es imposible determinar si una presentación es válida o no sin criterios de validez objetivos. Alentamos el uso de Sandbox para resolver cualquier problema potencial con desafíos antes de publicarlos en el sitio principal.
Mego
Además de dicha regla abstracta como "reconocible", sería mejor especificar un tamaño mínimo.
manatwork
Como nadie lo ha enchufado todavía, tenemos un entorno limitado en el meta que está diseñado para ayudar a los nuevos desafíos a obtener comentarios. Puede encontrarlo aquí: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi el
1
En realidad no son solo 19 círculos. También hay algunos arcos circulares en los bordes. (6 de ellos cubriendo un ángulo de 2π / 3, 12 cubriendo π, 18 cubriendo π / 6)
Martin Ender

Respuestas:

23

Mathematica, 177 173 128 124 120 bytes

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}

ingrese la descripción de la imagen aquí

La idea principal es componer el resultado de seis versiones rotadas de esto:

ingrese la descripción de la imagen aquí

Esto a su vez es una mesa rectangular de arcos circulares idénticos con dos esquinas cortadas. Si eliminamos la cizalladura y representamos cada centro de círculo con a #, básicamente queremos distribuir los círculos en este patrón:

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

Estos bordes se cortan imponiendo la condición -3 < x-y < 4en los índices 2D (ya que el valor de x-yes constante a lo largo de las diagonales) y la cizalla proviene de la multiplicación de estosx y yde los vectores de base no ortogonales que abarcan la cuadrícula que estamos buscando.

Esta orientación particular de los arcos no rotados resulta ser la más corta ya que ambos extremos del arco se dividen de Pimanera uniforme para que el arco se pueda expresar como Pi/{6,2}(todos los demás arcos requerirían un signo menos adicional o números enteros en el numerador).

Martin Ender
fuente
Use √3 para guardar 2 caracteres y 0 bytes, mientras elimina una fuente de error numérico.
Kelly Lowder
@KellyLowder Buen punto, fijo.
Martin Ender el
8

OpenSCAD, 228 bytes

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

La siguiente es una versión que permite a alguien establecer los parámetros r (radio) yw (ancho de los anillos).

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

Esta versión tiene exactamente 246 caracteres.
Parte de este código es técnicamente innecesario, pero hace que se parezca más a la imagen.

Henry Wildermuth
fuente
Recibo este error en 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. No obtengo ese error cuando uso el cliente OpenSCAD real en mi Mac. Sin embargo, pude replicar ese error en OpenSCAD.net usando Chrome, lo cual es decepcionante. Piensa que es un problema con su servicio. ¿Podrías probar la aplicación de escritorio?
Henry Wildermuth
1
Me funcionó en la versión de escritorio (Ubuntu 14.04 LTS).
Benjamin Spector
1
Noté el patrón};} en tu código. Creo que podría reemplazarlo con seguridad}}, lo que afeitaría un personaje para ambas versiones. Lo probé yo mismo y parecía funcionar.
Benjamin Spector
6

Mathematica 263 Bytes

No es realmente competitivo con la presentación de @ MartinEnder, pero de todos modos me divertí con esto. ¡Dejo que los pétalos caminen al azar! El pétalo camina girando 60 grados al azar sobre uno de los puntos finales que también se elige al azar. Pruebo para ver si el extremo giratorio del pétalo cae fuera del disco grande, y si es así, la rotación va en sentido contrario.

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

Aquí está el código posterior que utilicé para la animación.

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

Paseo aleatorio de pétalos

Leí en alguna parte que las caminatas aleatorias bidimensionales eventualmente deben volver al origen. Parece que unos pocos miles de pasos garantizan el llenado del disco grande.

Kelly Lowder
fuente
Esta es una muy buena idea, pero con un número finito de iteraciones también hay una probabilidad distinta de cero de no llenar toda la flor. Probablemente deberías agregar una condición de terminación una vez que hayas dibujado 30 pétalos (esa es la forma más corta de determinar si realmente has terminado). Entonces sabrás que el dibujo se hace cuando terminas, y la probabilidad de no terminar sería cero.
Martin Ender
Independientemente de eso, hay muchos bytes que puede guardar: Sqrt[3]es 3^.5. No necesita definir ehasta su primer uso y puede usar este truco para guardar un byte en él, entonces v={e=0{,},{0,2}}. También puede usar alguna notación infijada como e~c~6o e~Disk~6, y ArcTan@@Subtract@@vdebería ser equivalente a ArcTan@@(#-#2)&@@v.
Martin Ender
Se utilizó infijo y también el operador √ para eliminar 15 bytes. Gracias por los consejos @MartinEnder. Se deshizo de / 2 y 2 * que canceló. Hay 180 pétalos, por lo que 4 ^ 4 iteraciones generalmente cubren aproximadamente la mitad del disco, y 5 ^ 5 hace el trabajo. La probabilidad de que 9 ^ 9 no cubra el disco es ~ 1 de 10 ^ 400,000, lo cual es mucho menos del 2% de error, por lo que no vale la pena verificar los bytes desperdiciados.
Kelly Lowder
3

JavaScript (ES6) / SVG, 299 bytes

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

Funciona generando múltiples pares de arcos de varias longitudes y luego rotándolos en su lugar.

Neil
fuente