Golf Blume des Lebens

19

Die Herausforderung besteht darin, die Blume des Lebens (die nach Ansicht einiger eine heilige geometrische Figur ist) in der Sprache Ihrer Wahl genau darzustellen.

Blume des Lebens

Der Entwurf besteht aus einer Anordnung von Kreisen und Teilkreisen mit Radius 1, deren Zentren auf einem Dreiecksgitter der Teilung 1 angeordnet sind, plus einem größeren Kreis mit Radius 3, der sie umgibt.

Das Design kann beliebig skaliert werden, es ist jedoch ein Fehler von maximal 2% aus mathematisch korrekten Gründen zulässig. Wenn Sie Rastergrafiken verwenden, wird der Durchmesser der kleinen Kreise effektiv auf mindestens etwa 100 Pixel begrenzt.

Da dies Codegolf ist, gewinnt der kürzeste Code (Bytes).

Benjamin Spector
quelle
10
Willkommen auf der Seite! Nur damit Sie wissen, ist es im Allgemeinen empfehlenswert, eine Weile zu warten, bevor Sie eine Antwort annehmen. Auf diese Weise werden andere Benutzer den Wettbewerb nicht als "vorbei" betrachten und es wird mehr Teilnahme und Wettbewerb geben.
DJMcMayhem
2
"visuell, erkennbar und korrekt" ist weder klar noch objektiv. Es ist unmöglich zu bestimmen, ob eine Einreichung ohne objektive Gültigkeitskriterien gültig ist oder nicht. Wir empfehlen die Verwendung der Sandbox , um potenzielle Probleme mit Herausforderungen herauszufinden, bevor Sie sie auf der Hauptseite veröffentlichen.
Mego
Zusätzlich zu einer solchen abstrakten Regel wie „erkennbar“ wäre es besser, eine Mindestgröße anzugeben.
Handarbeit
Da es noch niemand angeschlossen hat, haben wir eine Sandbox bei der Meta, die neuen Herausforderungen helfen soll, Feedback zu erhalten. Sie finden es hier: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi
1
Es sind eigentlich nicht nur 19 Kreise. Es gibt auch einige Kreisbögen an den Rändern. (6 von ihnen decken einen Winkel von 2π / 3 ab, 12 decken π, 18 decken π / 6 ab)
Martin Ender

Antworten:

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}

Bildbeschreibung hier eingeben

Die Hauptidee ist, das Ergebnis aus sechs gedrehten Versionen davon zusammenzusetzen:

Bildbeschreibung hier eingeben

Dies ist wiederum ein rechteckiger Tisch aus identischen Kreisbögen mit zwei abgeschnittenen Ecken. Wenn wir die Scherung entfernen und jeden Kreismittelpunkt mit einem darstellen #, möchten wir die Kreise grundsätzlich in diesem Muster verteilen:

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

Diese Kanten werden abgeschnitten, indem -3 < x-y < 4den 2D-Indizes die Bedingung auferlegt wird (da der Wert von x-yentlang der Diagonalen konstant ist) und die Scherung durch Multiplikation dieser xund ynicht orthogonaler Basisvektoren, die das gesuchte Gitter überspannen, erfolgt.

Diese besondere Ausrichtung der nicht gedrehten Bögen erweist sich als die kürzeste, da sich beide Enden des Bogens gleichmäßig teilen, Piso dass der Bogen ausgedrückt werden kann als Pi/{6,2}(alle anderen Bögen würden entweder ein zusätzliches Minuszeichen oder Ganzzahlen im Zähler erfordern).

Martin Ender
quelle
Verwenden Sie √3, um 2 Zeichen und 0 Bytes zu speichern und gleichzeitig eine Fehlerquelle zu beseitigen.
Kelly Lowder
@ KellyLowder Guter Punkt, behoben.
Martin Ender
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);

Das Folgende ist eine Version, mit der jemand die Parameter r (Radius) und w (Breite der Ringe) einstellen kann.

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

Diese Version ist genau 246 Zeichen.
Ein Teil dieses Codes ist technisch nicht erforderlich, lässt ihn jedoch eher wie das Bild aussehen.

Henry Wildermuth
quelle
Ich Error: Error: Parse error on line 1: ...x(k))o();circle(9);};}}}q(2);o(27); -----------------------^ Expecting 'TOK_ID', '}', 'TOK_IF', '!', '#', '%', '*', got ';'
erhalte
@AlexL. Ich erhalte diesen Fehler nicht, wenn ich den aktuellen OpenSCAD-Client auf meinem Mac verwende. Allerdings konnte ich diesen Fehler auf OpenSCAD.net mit Chrome replizieren, was enttäuschend ist. Ich denke, es ist ein Problem mit ihrem Service. Könnten Sie die Desktop-Anwendung versuchen?
Henry Wildermuth
1
Arbeitete für mich auf Desktop-Version (Ubuntu 14.04 LTS).
Benjamin Spector
1
Ich habe das Muster};} in Ihrem Code bemerkt. Ich denke, dass Sie das sicher durch}} ersetzen könnten, das ein Zeichen für beide Versionen rasieren würde. Ich habe es selbst getestet und schien zu funktionieren.
Benjamin Spector
6

Mathematica 263 Bytes

Mit @ MartinEnders Beitrag nicht wirklich konkurrenzfähig, aber ich hatte trotzdem Spaß daran. Ich lasse die Blütenblätter einen zufälligen Spaziergang machen! Das Blütenblatt dreht sich zufällig um 60 Grad um einen der Endpunkte, der ebenfalls zufällig ausgewählt wird. Ich prüfe, ob das rotierende Ende des Blütenblattes außerhalb der großen Scheibe liegt, und wenn ja, läuft die Rotation in die andere Richtung.

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

Hier ist der nachfolgende Code, den ich für die Animation verwendet habe.

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

Random Petal Walk

Ich habe irgendwo gelesen, dass zweidimensionale Irrwege irgendwann zum Ursprung zurückkehren müssen. Es scheint, als ob ein paar tausend Schritte das Füllen der großen Scheibe garantieren.

Kelly Lowder
quelle
Dies ist eine wirklich gute Idee, aber bei einer begrenzten Anzahl von Iterationen besteht auch eine Wahrscheinlichkeit ungleich Null, dass nicht die gesamte Blume gefüllt wird. Sie sollten wahrscheinlich eine Beendigungsbedingung hinzufügen, sobald Sie 30 Blütenblätter gezeichnet haben (dies scheint der kürzeste Weg zu sein, um festzustellen, ob Sie tatsächlich fertig sind). Dann würden Sie wissen, dass die Zeichnung fertig ist, wenn Sie beenden, und die Wahrscheinlichkeit, nicht zu beenden, wäre Null.
Martin Ender
Unabhängig davon gibt es eine Menge Bytes, die Sie speichern können: Sqrt[3]ist 3^.5. Sie müssen erst definieren, wann es ezum ersten Mal verwendet wird, und Sie können diesen Trick verwenden , um ein Byte darauf zu speichern v={e=0{,},{0,2}}. Sie können auch eine Infix-Notation wie e~c~6oder verwenden e~Disk~6und ArcTan@@Subtract@@vsollten gleichbedeutend mit sein ArcTan@@(#-#2)&@@v.
Martin Ender
Benutztes Infix und auch der Operator √, um 15 Bytes zu entfernen. Danke für die Tipps @MartinEnder. Hab / 2 und 2 * losgeworden, die abgesagt haben. Es gibt 180 Blütenblätter, sodass 4 ^ 4-Iterationen in der Regel etwa die Hälfte der Festplatte abdecken und 5 ^ 5 den Job erledigen. Die Wahrscheinlichkeit, dass 9 ^ 9 die Festplatte nicht abdeckt, beträgt ~ 1 von 10 ^ 400.000, was viel weniger als 2% Fehler ist.
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) />`)}

Es werden mehrere Bogenpaare unterschiedlicher Länge erzeugt und dann gedreht.

Neil
quelle