Golfing Fiore della vita


19

La sfida qui è quella di rappresentare con precisione il fiore della vita (che è una figura geometrica sacra secondo alcuni) nel linguaggio che preferisci.

fiore della vita

Il disegno consiste in una disposizione di cerchi e cerchi parziali del raggio 1, come mostrato i cui centri sono disposti su una griglia triangolare del passo 1, più un cerchio più grande del raggio 3 che li circonda.

Il design può essere ridimensionato a piacere, ma è consentito un errore massimo del 2% da matematicamente corretto. Se si utilizza la grafica raster, ciò limita effettivamente il diametro dei piccoli cerchi ad almeno circa 100 pixel.

Dato che si tratta di code-golf, vince il codice più breve (byte).


10
Benvenuti nel sito! Solo per questo, in genere è incoraggiato ad aspettare un po 'prima di accettare una risposta, in questo modo gli altri utenti non vedranno il concorso come "finito" e ci saranno più partecipazione e competizione.
DJMcMayhem

2
"visivo, riconoscibile e corretto" non è né chiaro né oggettivo. È impossibile determinare se una presentazione è valida o meno senza criteri oggettivi di validità. Incoraggiamo l'uso di Sandbox per risolvere eventuali problemi con problemi prima di pubblicarli sul sito principale.
Mego

Oltre a una regola così astratta come "riconoscibile", sarebbe meglio specificare una dimensione minima.
arte

Dal momento che nessuno lo ha ancora collegato, abbiamo un sandbox sul meta progettato per aiutare le nuove sfide a ottenere feedback. Puoi trovarlo qui: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi

1
In realtà non sono solo 19 cerchi. Ci sono anche alcuni archi circolari ai bordi. (6 di questi coprono un angolo di 2π / 3, 12 coprono π, 18 coprono π / 6)
Martin Ender

Risposte:


23

Mathematica, 177 173 128 124 120 byte

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}

inserisci qui la descrizione dell'immagine

L'idea principale è quella di comporre il risultato da sei versioni ruotate di questo:

inserisci qui la descrizione dell'immagine

Questo a sua volta è una tabella rettangolare di archi circolari identici con due angoli tagliati. Se rimuoviamo la cesoiatura e rappresentiamo ogni centro del cerchio con a #, fondamentalmente vogliamo distribuire i cerchi in questo modello:

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

Questi bordi vengono tagliati imponendo la condizione -3 < x-y < 4 sugli indici 2D (poiché il valore di x-yè costante lungo le diagonali) e la cesoiatura deriva dalla moltiplicazione di questi xe yda vettori di base non ortogonali che abbracciano la griglia che stiamo cercando.

Questo particolare orientamento degli archi non ruotati risulta essere il più breve poiché entrambe le estremità dell'arco si dividono uniformemente in Pimodo che l'arco possa essere espresso comePi/{6,2} (tutti gli altri archi richiederebbero e un segno meno o numeri interi aggiuntivi nel numeratore).


Utilizzare √3 per salvare 2 caratteri e 0 byte, eliminando al contempo una fonte di errore numerico.
Kelly Lowder,

@KellyLowder Buon punto, risolto.
Martin Ender,

8

OpenSCAD, 228 byte

$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 seguente è una versione che consente a qualcuno di impostare i parametri r (raggio) ew (larghezza degli anelli).

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

Questa versione ha esattamente 246 caratteri.
Parte di questo codice è tecnicamente superfluo ma lo rende più simile all'immagine.


Ricevo questo errore su 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 il

@AlexL. Non ricevo questo errore quando uso il client OpenSCAD effettivo sul mio mac. Tuttavia sono stato in grado di replicare quell'errore su OpenSCAD.net usando Chrome, il che è deludente. Pensa che sia un problema con il loro servizio. Potresti provare l'applicazione desktop?
Henry Wildermuth,

1
Ha funzionato per me sulla versione desktop (Ubuntu 14.04 LTS).
Benjamin Spector,

1
Ho notato il modello};} nel tuo codice. Penso che potresti tranquillamente sostituirlo con}} che raderebbe un personaggio per entrambe le versioni. L'ho provato io stesso e sembrava funzionare.
Benjamin Spector,

6

Mathematica 263 byte

Non sono molto competitivo con la presentazione di @ MartinEnder, ma mi sono comunque divertito. Lascio che i petali facciano una passeggiata casuale! Il petalo cammina ruotando di 60 gradi in modo casuale attorno a uno degli endpoint, anch'esso scelto casualmente. Provo a vedere se l'estremità rotante del petalo cade al di fuori del grande disco e, in tal caso, la rotazione procede dall'altra parte.

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

Ecco il codice successivo che ho usato per l'animazione.

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

Petal Walk casuale

Ho letto da qualche parte che le passeggiate casuali bidimensionali devono eventualmente tornare alle origini. Sembra che poche migliaia di passaggi garantiscano il riempimento del disco di grandi dimensioni.


Questa è davvero una bella idea, ma con un numero finito di iterazioni c'è anche una probabilità diversa da zero di non riempire l'intero fiore. Probabilmente dovresti aggiungere una condizione di terminazione dopo aver disegnato 30 petali (che sembra il modo più breve per determinare se hai effettivamente finito). Quindi sapresti che il disegno è terminato quando finisci e la probabilità di non terminare sarebbe zero.
Martin Ender,

Indipendentemente da ciò, ci sono molti byte che puoi salvare: Sqrt[3]è 3^.5. Non è necessario definire efino al primo utilizzo e puoi usare questo trucco per salvare un byte su di esso, quindi v={e=0{,},{0,2}}. Puoi anche usare alcune notazioni infissi come e~c~6o e~Disk~6, e ArcTan@@Subtract@@vdovrebbero essere equivalenti a ArcTan@@(#-#2)&@@v.
Martin Ender,

Utilizzato infix e anche l'operatore √ per radere 15 byte. Grazie per i suggerimenti @MartinEnder. Sbarazzato di / 2 e 2 * che è stato cancellato. Ci sono 180 petali, quindi 4 ^ 4 iterazioni in genere coprono circa metà del disco e 5 ^ 5 fa il lavoro. La probabilità che 9 ^ 9 non copra il disco è ~ 1 su 10 ^ 400.000, che è un errore molto inferiore al 2%, quindi non vale la pena di verificare i byte sprecati.
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) />`)}

Funziona generando più coppie di archi di varie lunghezze e ruotandole in posizione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.