Uruchom system Lindenmayer
Lindenmayer systemu (lub L-System) jest związana z Thue i posta systemów i jest stosowany w modelowaniu botanicznego i fraktalnej pokolenia .
Układ L jest opisany przez przepisywanie ciągów, w którym symbol z alfabetu symbolu jest odwzorowany na zastępującą sekwencję symboli. Zbiór tych mapowań stanowi właściwy system L.
Graficzna metoda wyjściowa opracowana przez Prusinkiewicza interpretuje wynikową sekwencję po zastosowaniu odwzorowań do sekwencji początkowej dla określonej liczby iteracji , jako polecenia Rysowania Żółwia: do przodu, do tyłu, w lewo, w prawo, tego rodzaju rzeczy. Może to wymagać dodatkowego kodu do kontrolowania skali rysunku, ponieważ różne liczby iteracji mogą powodować drastycznie różnej wielkości obrazy.
Twoim zadaniem jest wykonanie systemu L przy jak najmniejszej liczbie znaków. Twój program musi być w stanie renderować zarówno Dragon Curve, jak i Rozgałęzione Pędy ze strony Wikipedii, podając odpowiednie dane wejściowe (plik, wiersz poleceń, ale zewnętrznie do źródła, proszę).
To jest kod golfowy.
Edycja: Oto kilka przykładów, które opublikowałem w mieście. odpowiedz na SO / rotate-to-north { Gdzie pierwszy raz odkryłem system L } , odpowiedz na SO / how-to-program-a-fractal , odpowiedź na SO / recursion-in-postscript , comp.lang.postscript / recital , PostScript l-system collection , codegolf.SE/draw-a-sierpinski-triangle {geneza konkurencji między mną a Thomasem W} .
źródło
Odpowiedzi:
Mathematica
200198188171168Dodano spacje dla przejrzystości:
Gdzie:
Gramatyka zasad produkcji:
Sekwencja {2,4,6,8} istnieje, ponieważ używam
I^n
(I
= jednostki urojonej) do wykonywania zwrotów.Przykłady:
źródło
Graphics@k
,Graphics@Flatten@k
jeśli planujesz używać wielu iteracji. W przeciwnym razie ugryzie Cię Limit Rekurencji, a sesja Mma zostanie przerwana.Python,
369294Nie jestem zwycięzcą, ale i tak opublikuję to, co próbowałem.
Nie jest dobry w golfie w Pythonie ...... Może ktoś inny może to zrobić.
Wkład
Dane wejściowe pochodzą z zewnętrznego pliku o nazwie „l” (bez rozszerzenia), w następującym formacie:
Wiersz 1 : Stan początkowy (Axiom)
Wiersz 2 : Reguły oddzielone przecinkami
Symbole
f
iF
: Rysuj do przodu+
: Skręć w prawo o 5 stopni-
: Skręć w lewo o 5 stopni[
: Zapisz pozycję i nagłówek]
: Pozycja pop i nagłówekInne funkcje są ignorowane przez funkcję rysowania.
Reguły
Reguła ma format
"predecessor":"successor(s)"
Należy pamiętać, że cytaty są konieczne, zarówno pojedyncze, jak i podwójne.
predecessor
musi być pojedynczym znakiem.Ponadto nie ma żadnych niejawnych stałych: należy jawnie określić dla nich regułę bez zmian.
Przykłady
Rozgałęzione pędy
Wyjście
Zauważ, że źródło zostało zmodyfikowane, aby to udostępnić WYŁĄCZNIE W CELU SKALOWANIA WYKRESU DO WIDOCZNEGO OBSZARU. Konsola służy również do ukrywania „żółwia”.
Krzywa smoka
Wyjście
Ponownie, konsola służy do ukrywania „żółwia”.
Trójkąt Sierpińskiego
Generacje wyjściowe zmniejszono tutaj do 5.
źródło
f
,r
,l
; dodanie fikcyjnego parametru doo
ic
; a następnie zmieniając pseudo-przełącznik na{'f':fd,'F':fd,'+':rt,'-':lt,'[':o,']':c}[k](5)
g
i myślę,o
ic
są warte eliminując z inlineif
sprawozdania (tańsze niżglobal
deklaracji)o
ic
bezpośrednio w pseudo-przełączniku) dawały błędy składniowe, ale inne nie t.s,R,*p=input().split()
. 3. Wygeneruj końcową wartośćs
wedługexec('s="".join(map(eval(R).get,s));'*8)
. 4. Pomińcontinue
. 5. Wcięcie tylko 1 spacja. 6. Zaoszczędź miejsce poif
przełączeniu boków testu. 7. Umieścićk:int
wdict
(pierwsze wejście) i wtedy nie trzebaexcept: try:
. (Dostaję 215 znaków.)JavaScript (179 bajtów)
Nie do końca wiem, czy to się kwalifikuje, ponieważ obiekt reguł wykonuje cały rysunek.
Demo (Dragon, animowane):
- Rozszerzone: http://jsfiddle.net/SVkMR/9/show/light
- Z kodem: http://jsfiddle.net/SVkMR/9/
Zminimalizowane:
Czytelny (ish):
Wkład:
Stosowanie:
Bonus: Golden Spiral http://jsfiddle.net/SVkMR/35/show/light/
źródło
Postscriptum
264298295255Oto moja próba zrobienia tego inaczej. Zamiast makropolecenia, którego zwykle używam, ten sprawdza rozmiar stosu wykonania w celu ograniczenia rekurencji. Jeśli granica zostanie przekroczona, przestaje rekurencyjnie sprawdzać procedurę i próbuje interpretować polecenia żółwia (i odrzuca w
pop pop
inny sposób). Zaletą tej metody jest to, że nie wymaga ona ogromnej ilości pamięci. Wadą jest to, że kontrola rekurencji jest raczej niezdarna, ponieważ rozmiar stosu rośnie o więcej niż tylko 1 z jednego poziomu rekurencji na następny.Edycja: +34 znaków do rozgałęzienia.
Edycja: -3 znaki. Przeprojektowany, aby używać stosu operandów do kontroli rekurencji. To sprawia, że podstawowy system jest znacznie prostszy. Ale nawiasy potrzebują niezależnego stosu, więc umieściłem zapisaną pozycję w stosie słownika i prawie zwróciłem wszystkie oszczędności.
Również przeprojektowany, aby używać ciągów i liczb całkowitych zamiast tablic i nazw.
Edycja: -40 znaków. Dodano dwie procedury wywoływania nazw systemowych według numerów (wydaje mi się, że nie mogę uruchomić surowych tokenów binarnych. Ale ten idiom działa dla mnie.)
Binarnie częściowo komentowane.
Un- „binarny”.
Wymaga zdefiniowania systemu L w słowniku na dyktafonie, z początkowym łańcuchem i pozycją początkową żółwia na stosie operandu (np. Dołączonym do źródła
gs dragon.sys lsys.ps
).Dragon Curve.
Rozgałęzione Pędy.
Nie golfił i skomentował.
Aby go uruchomić, te 3 bloki można zapisać jako 3 pliki: dragon.ps, stems.ps, lsys.ps (dowolny z powyższych bloków programu będzie działał identycznie). Następnie uruchom z gs:
gs dragon.ps lsys.ps
lubgs stems.ps lsys.ps
. W razie potrzeby można je najpierw połączyć .cat dragon.ps lsys.ps | gs -
Lubcat stems.ps lsys.ps | gs -
.Brak obrazu łodyg. Nie robi się już bardziej interesujący na wyższych głębokościach.
źródło
Mathematica 290
Ta implementacja od podstaw koncentruje się raczej na danych wyjściowych niż na przetwarzaniu. Nie używa reguł produkcji. Może to nie być odpowiednia odpowiedź na wyzwanie.
Rozgałęzione pędy dostosowane do pokazu Theo Graya .
Kod
Stosowanie
Pierwszy parametr określa, czy Smocza Krzywa, czy Pędy Gałęzi będą wyświetlane. Drugi termin odnosi się do generacji.
Więcej przykładów
źródło
A->F[+A][-A]
gdzieF
jest ruch,+
obraca się w lewo o 30,-
obraca się w prawo o 30 i[
/]
są push / pop