Fleur de vie de golf

19

Le défi ici est de représenter avec précision la fleur de la vie (qui est selon certains une figure géométrique sacrée) dans la langue de votre choix.

fleur de vie

La conception consiste en un arrangement de cercles et de cercles partiels de rayon 1, comme illustré, dont les centres sont disposés sur une grille triangulaire de pas 1, plus un plus grand cercle de rayon 3 qui les entoure.

La conception peut être mise à l'échelle comme vous le souhaitez, mais une erreur maximale de 2% par rapport à mathématiquement correcte est autorisée. Si vous utilisez des graphiques raster, cela limite efficacement le diamètre des petits cercles à au moins environ 100 pixels.

Puisqu'il s'agit de code-golf, le code le plus court (octets) gagne.

Benjamin Spector
la source
10
Bienvenue sur le site! Juste pour que vous le sachiez, il est généralement encouragé d'attendre un moment avant d'accepter une réponse, de cette façon les autres utilisateurs ne verront pas le concours comme "terminé", et il y aura plus de participation et de compétition.
DJMcMayhem
2
«visuel, reconnaissable et correct» n'est ni clair ni objectif. Il est impossible de déterminer si une soumission est valide sans critères de validité objectifs. Nous encourageons l'utilisation du Sandbox pour résoudre tout problème potentiel avec des défis avant de les publier sur le site principal.
Mego
En plus d'une règle abstraite comme «reconnaissable», il serait préférable de spécifier une taille minimale.
manatwork
Comme personne ne l'a encore branché, nous avons un bac à sable sur la méta qui est conçu pour aider les nouveaux défis à obtenir des commentaires. Vous pouvez le trouver ici: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi
1
Ce n'est pas seulement 19 cercles. Il y a aussi des arcs circulaires sur les bords. (6 d'entre eux couvrant un angle de 2π / 3, 12 couvrant π, 18 couvrant π / 6)
Martin Ender

Réponses:

23

Mathematica, 177 173 128 124 120 120 octets

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}

entrez la description de l'image ici

L'idée principale est de composer le résultat de six versions tournées de ceci:

entrez la description de l'image ici

Ceci est à son tour une table rectangulaire d'arcs de cercle identiques avec deux coins coupés. Si nous supprimons le cisaillement et représentons chaque centre de cercle avec un #, nous voulons essentiellement répartir les cercles dans ce modèle:

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

Ces arêtes sont coupées en imposant la condition -3 < x-y < 4aux indices 2D (puisque la valeur de x-yest constante le long des diagonales) et le cisaillement provient de leur multiplication xet yde vecteurs de base non orthogonaux qui couvrent la grille que nous recherchons.

Cette orientation particulière des arcs non tournés se révèle être la plus courte car les deux extrémités de l'arc se divisent uniformément de Pisorte que l'arc peut être exprimé comme Pi/{6,2}(tous les autres arcs nécessiteraient soit un signe moins supplémentaire soit des nombres entiers dans le numérateur).

Martin Ender
la source
Utilisez √3 pour enregistrer 2 caractères et 0 octet, tout en éliminant une source d'erreur numérique.
Kelly Lowder
@KellyLowder Bon point, corrigé.
Martin Ender
8

OpenSCAD, 228 octets

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

Ce qui suit est une version permettant à quelqu'un de définir les paramètres r (rayon) et w (largeur des anneaux).

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

Cette version contient xactly 246 caractères.
Une partie de ce code est techniquement inutile mais le fait ressembler davantage à l'image.

Henry Wildermuth
la source
Je reçois cette erreur sur 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. Je n'obtiens pas cette erreur lorsque j'utilise le client OpenSCAD réel sur mon Mac. Cependant, j'ai pu reproduire cette erreur sur OpenSCAD.net en utilisant Chrome, ce qui est décevant. Il pense que c'est un problème avec leur service. Pourriez-vous essayer l'application de bureau?
Henry Wildermuth
1
A travaillé pour moi sur la version de bureau (Ubuntu 14.04 LTS).
Benjamin Spector
1
J'ai remarqué le motif};} dans votre code. Je pense que vous pouvez remplacer cela en toute sécurité par}} qui raserait un caractère pour les deux versions. Je l'ai testé moi-même et j'ai semblé fonctionner.
Benjamin Spector
6

Mathematica 263 octets

Pas vraiment compétitif avec la soumission de @ MartinEnder mais je me suis quand même amusé avec ça. Je laisse les pétales marcher au hasard! Le pétale marche en tournant de 60 degrés au hasard autour de l'un des points d'extrémité qui est également choisi au hasard. Je teste pour voir si l'extrémité rotative du pétale tombe à l'extérieur du grand disque, et si c'est le cas, la rotation va dans l'autre sens.

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

Voici le code suivant que j'ai utilisé pour l'animation.

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

Randonnée aléatoire des pétales

J'ai lu quelque part que les promenades aléatoires en 2 dimensions doivent finalement revenir à l'origine. Il semble que quelques milliers d'étapes garantissent le remplissage du grand disque.

Kelly Lowder
la source
C'est une très bonne idée, mais avec un nombre fini d'itérations, il y a aussi une probabilité non nulle de ne pas remplir toute la fleur. Vous devriez probablement ajouter une condition de résiliation une fois que vous avez dessiné 30 pétales (cela semble être le moyen le plus court pour déterminer si vous avez réellement terminé). Vous sauriez alors que le dessin est terminé lorsque vous terminez, et la probabilité de ne pas terminer serait nulle.
Martin Ender
Indépendamment de cela, il y a beaucoup d'octets que vous pouvez enregistrer: Sqrt[3]is 3^.5. Vous n'avez pas besoin de définir ejusqu'à sa première utilisation et vous pouvez utiliser cette astuce pour enregistrer un octet dessus, donc v={e=0{,},{0,2}}. Vous pouvez également utiliser une notation infixe comme e~c~6ou e~Disk~6, et ArcTan@@Subtract@@vdevrait être équivalent à ArcTan@@(#-#2)&@@v.
Martin Ender
Infixe utilisé et également l'opérateur √ pour raser 15 octets. Merci pour les conseils @MartinEnder. Je me suis débarrassé de / 2 et 2 * qui ont annulé. Il y a 180 pétales, donc 4 ^ 4 itérations couvrent généralement environ la moitié du disque, et 5 ^ 5 fait le travail. La probabilité que 9 ^ 9 ne couvrent pas le disque est d'environ 1 sur 10 ^ 400 000, ce qui représente une erreur bien inférieure à 2%, donc ne vaut pas les octets perdus à vérifier.
Kelly Lowder
3

JavaScript (ES6) / SVG, 299 octets

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

Fonctionne en générant plusieurs paires d'arc de différentes longueurs puis en les faisant pivoter en place.

Neil
la source