Krzywa Hilberta jest przestrzenią napełniania fraktali, który może być przedstawiony jako systemu Lindenmayer z kolejnych pokoleń, które wyglądają tak:
Dzięki http://www.texample.net/tikz/examples/hilbert-curve/ dla obrazu.
Cel
Napisz najkrótszy możliwy program (w bajtach), który pobiera dodatnią liczbę całkowitą n ze standardowego wejścia i rysuje krzywą Hilberta n-tego rzędu do standardowego, używając tylko ukośnika do przodu, ukośnika do tyłu, spacji i nowej linii.
Na przykład, jeśli wejście jest 1
wyjściem, musi być
\
\/
Jeśli wejście jest 2
wyjściem, musi być
/
\/\
/\ \
/ /\/
\ \
\/
Jeśli wejście jest 3
wyjściem, musi być
\
/\/
/ /\
\/\ \ \
/\ / / /
/ / \/ \/\
\ \/\ /\ \
\/ / / / /\/
/\/ / \ \
\ \/\ \/
\/\ \
/ /\/
\ \
\/
I tak dalej. (Wyglądają ładniej, jeśli wkleisz je w coś o mniejszych odstępach między wierszami).
Dane wyjściowe nie powinny zawierać znaków nowej linii powyżej lub poniżej krańców krzywej ani żadnych spacji końcowych na żadnych liniach.
.map(&:rstrip)
trzeba było dodać, aby spełnić wymóg „brak spacji końcowych”.x
i skrócić przypisanie doy
id
, w sumie 205 znaków (patrz ten sam link, jak poprzednio).Python, 282
Wykorzystuje to podejście rekurencyjne do konstruowania krzywej Hilberta n-tego rzędu z poprzedniej krzywej. Krzywe są reprezentowane jako tablica liczb 2d dla lepszego krojenia i manipulacji.
Oto kilka przykładów:
źródło
Malsys -
234221 znakówCzuję tutaj trochę systemów L :) Malsys to internetowy tłumacz systemu L. To nie jest naprawdę poważny wpis, ale czułem, że to rozwiązanie jest dość interesujące.
Składnia Malsys nie jest zbyt dobra do gry w golfa, ponieważ zawiera wiele długich słów kluczowych, ale mimo to jest dość krótka, czytelna i wyrazista.
http://malsys.cz/g/3DcVFMWn
Tłumacz ustny: http://malsys.cz/Process
Wersja golfowa:
A co powiesz na sześciokątną krzywą Ascii Gosper? :)
http://malsys.cz/g/ae5v5vGB
źródło
JavaScript (ES6) 313
340Edytuj Niektóre postacie usunięte przy użyciu naprawdę złych praktyk - takich jak zmienna globalna w zamiast wartości zwracanej z funkcji H
Konwertując pozycję x, y na odległość d (patrz Wikipedia ) dla każdego x, y i sprawdzając, czy najbliższe pozycje są połączone,
Przetestuj w konsoli FireFox. Wejście przez wyskakujące okienko, wyjście przez konsolę.log.
Nie ma spacji końcowych ani znaków nowej linii powyżej lub poniżej obrazu. Ale każda linia jest zakończona nową linią, myślę, że to właściwy sposób, aby zrobić obraz sztuki Ascii.
źródło
alert
zamiastconsole.log
. Masz również dodatkowe miejsce pofor
czwartej linii i powinieneś być w stanie pozbyć się ostatniego podziału linii.Perl, 270 znaków
Super golfa
Nie tyle golfa
Mógłbym chyba bardziej pograć w golfa, jeśli lepiej rozumiem Perla. Stosuje podejście systemowe Lindenmayera, stosując reguły produkcji zdefiniowane w wierszu 1.
źródło
APL (Dyalog Unicode) , 90 bajtów SBCS
Wypróbuj online!
2 2⍴0
macierz zerowa 2x2{ }⍣⎕
wprowadź N i zastosuj funkcję N razy⍵,⍨-⊖⍵
konkatenuje na lewo od matrycy odwróconą pionowo i zanegowaną kopię samej siebie(2×s←⍴⍵)↑
uzupełnij zerami, aby wymiary (zapamiętane jakos
) były dwa razy większe niż argumentu¯.5×≢⍵
obróć w dół, aby wyśrodkować go w pionie, wciśnięty pomiędzy zera wypełnienia2@(¯1 0+3 1×s÷2)
umieść 2-s w określonych lokalizacjach - są to łączniki pomiędzy mniejszymi instancjami fraktala(⊢+⍉)
dodaj macierz z transponowanym ja3|
moduł 3; użyliśmy negacji, więc pamiętaj, że -1≡2 (mod 3) i -2≡1 (mod 3)' /\'[ ]
użyj elementów macierzy jako wskaźników w ciągu' /\'
1↓∘⍉∘⌽⍣4
przyciąć pusty margines o szerokości 1 elementu ze wszystkich stron↓
podzielony na linie' +$'⎕r''¨
usuń końcowe spacje z każdego (wymaga tego wyzwanie)⎕∘←¨
wyjście każdegoźródło