... więc jest to wyzwanie, aby uczynić mnie drzewem.
Utwórz program lub funkcję o nazwie drzewo, która pobiera pojedynczy argument liczby całkowitej, N i rysuje Drzewo Pitagorejskie na poziomach N, gdzie poziom 0 to tylko pień.
Każde skrzyżowanie drzewa powinno umieszczać wierzchołek trójkąta w losowym punkcie na obwodzie (ten punkt powinien być równomiernie rozmieszczony w co najmniej 5 równo rozmieszczonych punktach lub równomiernie na całym półkolu).
Opcjonalnie twoje drzewo może być 3d, być kolorowe lub być oświetlone zgodnie z porą dnia. Jest to jednak gra w golfa, więc wygrywa najmniejszy plik.
EDYCJA: Zamknę konkurs i przyjmuję najmniejszą odpowiedź, gdy będzie miała tydzień
code-golf
graphical-output
Alexander-Brett
źródło
źródło
Odpowiedzi:
Mathematica,
246234221 znakówZ pewnością nie jest to najbardziej elegancki / najkrótszy sposób na zrobienie tego.
Stosowanie:
f[8]
A oto przykładowe wyniki dla
f[6]
if[10]
odpowiednio.Nieco golfisty:
źródło
Show
tam iModule
jest to również niepotrzebne.Show
podpowiedź, ale jak mogę się tego pozbyćModule
? Jeśli nie podam adresup
lokalnego, zostanie on nadpisany w połączeniach rekurencyjnych, więc nie mogę wykonać obu połączeń z tym samymp
, prawda?Block
, który jest krótszy niżModule
.CFDG, 134 znaki
Ten nie jest dokładnie poprawny, ponieważ nie można ograniczyć głębokości rekurencji. Ale problem wymaga tylko rozwiązania tego problemu . :)
Wyniki wyglądają mniej więcej tak
W przypadku kolejnych 46 znaków ( łącznie 180 znaków ) możesz nawet pokolorować:
źródło
Postscriptum,
322270Edycja: Wygląda na to, że
realtime
nie można go użyć jako właściwego losowego generatora. Dlatego użyjemy do tego celu zmiennej środowiskowej i uruchomimy program w następujący sposób:lub
Teraz nasze drzewa są mniej przewidywalne. 14 bajtów dodaje się do łącznej liczby. Inne zmiany: 1) Argument programu jest teraz przekazywany w wierszu poleceń. 2) Do tego celu nie służy jawny rozmiar stosu licznika iteracji (kąt obrotu lewej gałęzi jest zapisywany na stosie, aby później narysować prawą gałąź). 3) Nie ma nazwanej zmiennej dla wymaganej głębokości - rozmiar stosu to jego przesunięcie na stosie. Zostaje tam przy wyjściu, tzn. Nie jest zużywany.
Myślę, że to dość oczywiste - stan grafiki jest przygotowany, a
f
procedura jest wywoływana rekurencyjnie dla każdego kolejnego poziomu głębokości, dwa razy - dla gałęzi „lewej” i „prawej”. Praca z prostokątem o1x1
rozmiarze (patrz oryginalna skala) pozwala uniknąć mnożenia przez długość boku. Kąt obrotu lewej gałęzi jest losowy - stosuje się jeden z 5 losowych równomiernie rozmieszczonych podziałów - myślę, że zapobiega możliwym brzydkim przypadkom równomiernej losowości.Wymagana głębokość może wynosić ponad 20 lub więcej.
Następna jest wersja golfowa, wykorzystująca tokeny binarne zakodowane w ASCII (patrz odpowiedź luser droog z połączonego tematu). Uwaga,
cos
,sin
,rand
nie mogą korzystać z tego zapisu..
źródło
-dGraphicsAlphaBits
jest flagą na wyjściu anty-aliasu, aby zapobiec postrzępionym krawędziom większych kwadratów, można go pominąć (lub „ukryć” np. w zmiennej środowiskowej). Niektórym może się to bardziej podobać bez tej flagi (liście drzew mają większą objętość). Cóż, te 20 bajtów nie jest aż tak ważne. Powiedziałbym, że 20-25% zniżki na używanie tokenów binarnych zakodowanych w formacie ascii (sądząc po odpowiedzi na powiązany temat). Może 50% zniżki bez kodowania ascii, 2 bajty binarne na token nazwy systemu. Będzie wyglądał jak niektóre zwykle wygrywające języki;)Coffeescript
377B352BCzuję się brudny pisząc coffeescript, ale nie mogę znaleźć porządnego pakietu rysunkowego dla Python3: - /
JavaScript
393B385BNieco ładniejszy w javascript i jestem znacznie bardziej zadowolony z pętli for, ale bez [x, y, z] = Składni Po prostu nie potrafię zrobić tego na tyle krótko, aby pokonać coffeescript
Muszę powiedzieć, że jestem trochę zirytowany, to prawie dwa razy dłużej niż rozwiązanie matematyczne: - / zobacz to w akcji: http://jsfiddle.net/FK2NX/3/
źródło
X
zwrotuX
, możesz połączyć je w łańcuch. I można zapisać kolejny dobry kilka znaków, zapisującM.sin
iM.cos
zmiennych pojedynczych znaków.s=M.sin
.rotate
używathis
, asin
nie używa . Musiałbyś zrobić coś takiegoR=X.rotate.bind(X)
, ale prawdopodobnie nie jest to już więcej warte.