Kwiat życia w golfa

19

Wyzwanie polega na tym, aby dokładnie przedstawić kwiat życia (według niektórych świętą figurę geometryczną) w wybranym języku.

kwiat życia

Projekt składa się z układu okręgów i częściowych okręgów o promieniu 1, jak pokazano, których środki ułożone są na trójkątnej siatce o skoku 1, oraz wokół jednego większego okręgu o promieniu 3, który je otacza.

Projekt można skalować według własnego uznania, ale dopuszczalny jest błąd maksymalny 2% z poprawności matematycznej. W przypadku korzystania z grafiki rastrowej skutecznie ogranicza to średnicę małych kółek do co najmniej około 100 pikseli.

Ponieważ jest to golfowy kod, wygrywa najkrótszy kod (bajty).

Benjamin Spector
źródło
10
Witamy na stronie! Po prostu dobrze jest wiedzieć, że ogólnie zaleca się, aby poczekać chwilę przed zaakceptowaniem odpowiedzi, w ten sposób inni użytkownicy nie będą postrzegać konkursu jako „zakończonego” i będzie więcej uczestnictwa i konkurencji.
DJMcMayhem
2
„wizualne, rozpoznawalne i poprawne” nie jest ani jasne, ani obiektywne. Niemożliwe jest ustalenie, czy dane zgłoszenie jest ważne bez obiektywnych kryteriów ważności. Zachęcamy do korzystania z piaskownicy, aby rozwiązać ewentualne problemy związane z wyzwaniami przed opublikowaniem ich na głównej stronie.
Mego
Oprócz takich abstrakcyjnych reguł, takich jak „rozpoznawalny”, lepiej byłoby określić minimalny rozmiar.
manatwork
Ponieważ nikt go jeszcze nie podłączył, mamy piaskownicę w meta, która została zaprojektowana, aby pomóc nowym wyzwaniom uzyskać informacje zwrotne. Można go znaleźć tutaj: meta.codegolf.stackexchange.com/questions/2140/…
tuskiomi
1
To właściwie nie tylko 19 kręgów. Na krawędziach znajdują się również okrągłe łuki. (6 z nich obejmuje kąt 2π / 3, 12 pokrywa π, 18 pokrywa π / 6)
Martin Ender

Odpowiedzi:

23

Mathematica, 177 173 128 124 120 bajtów

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}

wprowadź opis zdjęcia tutaj

Główną ideą jest skomponowanie wyniku z sześciu obróconych wersji tego:

wprowadź opis zdjęcia tutaj

To z kolei jest prostokątnym stołem o identycznych łukach koła z odciętymi dwoma narożnikami. Jeśli usuniemy ścinanie i reprezentujemy każdy środek okręgu za pomocą #, zasadniczo chcemy rozmieścić koła w tym wzorze:

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

Te krawędzie są odcięte przez nałożenie warunku -3 < x-y < 4na wskaźniki 2D (ponieważ wartość x-yjest stała wzdłuż przekątnych), a ścinanie pochodzi z pomnożenia ich xoraz yprzez nieortogonalne wektory bazowe, które obejmują siatkę, której szukamy.

Ta szczególna orientacja nieobróconych łuków okazuje się być najkrótsza, ponieważ oba końce łuku dzielą się równomiernie, Pidzięki czemu łuk może być wyrażony jako Pi/{6,2}(wszystkie inne łuki wymagałyby dodatkowego znaku minus lub liczb całkowitych w liczniku).

Martin Ender
źródło
Użyj √3, aby zapisać 2 znaki i 0 bajtów, jednocześnie eliminując źródło błędu numerycznego.
Kelly Lowder
@KellyLowder Dobry punkt, naprawiony.
Martin Ender,
8

OpenSCAD, 228 bajtów

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

Poniżej znajduje się wersja umożliwiająca ustawienie parametrów r (promień) i w (szerokość pierścieni).

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

Ta wersja ma dokładnie 246 znaków.
Część tego kodu jest technicznie niepotrzebna, ale sprawia, że ​​wygląda bardziej jak obrazek.

Henry Wildermuth
źródło
Otrzymuję ten błąd na 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. Ten błąd nie pojawia się, gdy używam rzeczywistego klienta OpenSCAD na moim komputerze Mac. Byłem jednak w stanie zreplikować ten błąd na OpenSCAD.net za pomocą chrome, co jest rozczarowujące. Uważa, że ​​jest to problem z ich usługą. Czy możesz wypróbować aplikację komputerową?
Henry Wildermuth,
1
Pracowałem dla mnie w wersji na komputer (Ubuntu 14.04 LTS).
Benjamin Spector,
1
Zauważyłem wzorzec};} w twoim kodzie. Myślę, że możesz bezpiecznie zastąpić to}}, co goli znak dla obu wersji. Przetestowałem to sam i wydawało się, że działa.
Benjamin Spector,
6

Mathematica 263 bajtów

Niezbyt konkurencyjne wobec przesłania @ MartinEnder, ale mimo to dobrze się bawiłem. Pozwoliłem płatkom na przypadkowy spacer! Płatek chodzi, obracając losowo o 60 stopni wokół jednego z punktów końcowych, który jest również losowo wybierany. Sprawdzam, czy obracający się koniec płatka wypadnie poza duży dysk, a jeśli tak, obrót przebiega w drugą stronę.

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

Oto kolejny kod, którego użyłem do animacji.

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

Losowy spacer z płatkami

Czytałem gdzieś, że dwuwymiarowe losowe spacery muszą ostatecznie wrócić do źródła. Wygląda na to, że kilka tysięcy kroków gwarantuje wypełnienie dużego dysku.

Kelly Lowder
źródło
To naprawdę fajny pomysł, ale przy skończonej liczbie iteracji istnieje również niezerowe prawdopodobieństwo, że nie wypełni się cały kwiat. Prawdopodobnie powinieneś dodać warunek zakończenia, gdy narysujesz 30 płatków (to wydaje się być najkrótszym sposobem ustalenia, czy faktycznie skończyłeś). Wtedy wiedziałbyś, że rysunek jest wykonywany po zakończeniu, a prawdopodobieństwo, że nie zostanie zakończone, wynosi zero.
Martin Ender,
Niezależnie od tego możesz zaoszczędzić wiele bajtów: Sqrt[3]is 3^.5. Nie musisz definiować edo pierwszego użycia i możesz użyć tej sztuczki, aby zapisać na niej bajt, więc v={e=0{,},{0,2}}. Możesz także użyć notacji infix, takiej jak e~c~6lub e~Disk~6, i ArcTan@@Subtract@@vpowinna ona być równoważna z ArcTan@@(#-#2)&@@v.
Martin Ender,
Użyto infix, a także operatora √, aby zgolić 15 bajtów. Dzięki za wskazówki @MartinEnder. Pozbyłem się / 2 i 2 *, które anulowałem. Jest 180 płatków, więc 4 ^ 4 iteracje zwykle zajmują około połowy dysku, a 5 ^ 5 wykonuje to zadanie. Prawdopodobieństwo, że 9 ^ 9 nie zakryje dysku, wynosi ~ 1 na 10 ^ 400 000, co stanowi znacznie mniej niż 2% błędu, więc nie warto tracić bajtów na sprawdzenie.
Kelly Lowder
3

JavaScript (ES6) / SVG, 299 bajtów

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

Działa, generując wiele par łuków o różnych długościach, a następnie obracając je na miejsce.

Neil
źródło