Krzywa Hilberta jest rodzajem krzywej wypełniającej przestrzeń i zasadniczo odwzorowuje linię na płaszczyznę. Każdy punkt na linii odpowiada tylko jednemu punktowi na płaszczyźnie, a każdy punkt na płaszczyźnie odpowiada tylko jednemu punktowi na linii. Pokazano iteracje od 0 do 4 krzywej Hilberta:
Iteracje 0 do 4:
Cel tego zadania: Napisz kod, który rysuje czwartą iterację krzywej Hilberta, jak zdefiniowano powyżej. Twój kod powinien być kompletny - innymi słowy, jeśli utworzysz funkcję do rysowania krzywej Hilberta, twój kod musi wywołać tę funkcję. Dane wyjściowe można wyświetlić bezpośrednio na ekranie lub zapisać je w pliku obrazu. Krzywa może być obracana lub odwracana, ale linie muszą przecinać się pod kątem prostym, a wynik nie może być rozciągnięty. Sztuka ASCII jest doceniana, ale nie będzie akceptowana. Najkrótszy kod w bajtach wygrywa!
źródło
Odpowiedzi:
R, 90 bajtów
Bezwstydny port R algorytmu zastosowanego w łączu opublikowanym przez @Luis Mendo.
Dla
n=5
otrzymujemy:źródło
MATL ,
3938 bajtówPobiera to liczbę iteracji jako dane wejściowe. Jeśli chcesz go na stałe zakodować, zastąp
i
go numerem.Program jest portem kodu Matlaba autorstwa Jonasa Lundgrena pokazanego tutaj .
Wynik pokazano poniżej. Możesz także spróbować w MATL Online! Wytworzenie wyjścia zajmuje kilka sekund. Ten kompilator jest eksperymentalny; może być konieczne odświeżenie strony i ponowne naciśnięcie przycisku „Uruchom”, jeśli początkowo nie działa.
Wyjaśnienie
źródło
MATLAB,
264262161 bajtówDziała to nadal bardzo podobnie, z tym wyjątkiem, że w zasadzie obliczamy „pochodną” krzywej Hilberta, którą następnie „integrujemy” poprzez „sumę”. Zmniejsza to rozmiar kodu o całkiem sporo bajtów.
Stara wersja
To tylko proste podejście rekurencyjne. Dla uproszczenia użyłem liczb zespolonych do przechowywania informacji wektorowych. Możesz zmienić krzywą na części
h(0,1,1+i,4)
. Pierwszy argumentp=0
to pozycja początkowa, drugi argumentf
to flaga orientacji (+1
lub-1
), trzeci argumentd
to kierunek / obrót, w którym należy narysować krzywą, a czwartyl
to głębokość rekurencji.Tak to wygląda w starszych wersjach:
Tak to wygląda w 2015b:
->źródło
cumsum
pomysłowi, który jest po prostu genialny!MATLAB / Octave, 202 bajty
Zauważyłem, że wersja @LuisMendo, która
jestpołączona, była znacznie krótsza niż poprzednie „ręcznie robione” rozwiązanie, ale używa zupełnie innego podejścia. Zamieszczam tutaj wersję golfa jako CW:Ta wersja jest oparta na podejściu systemowym Lindenmayer:
źródło
JavaScript (ES6),
266...233232 bajtyRenderowanie SVG krzywej Hilberta.
Zaoszczędził 1 bajt dzięki Neilowi
źródło
fill=none
Python 3,
177175171 bajtówProsta implementacja systemu Lindenmayera dla krzywej Hilberta. Zapraszamy do gry w golfa!
Edycja: -2 bajty dzięki Kade. -3 bajty od zmiany struktury budowy krzywej Hilberta. -1 bajt dzięki produktom ETH.
Ungolfing
źródło
t
można zapisać dwa bajty:t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]
. Ponieważ wzór jest prawie taki sam dla nich dwóch, zastanawiam się, czy jest jakiś sposób, aby tego użyć ...if c>"E":
abyif"E"<c:
zapisać bajt?MSWLogo (wersja 6.5b), 136 bajtów
Na podstawie końcowego programu krzywej Hilberta tutaj .
h
Zdefiniowana jest funkcja , która przyjmuje liczbę iteracji:n
(na podstawie 1), kąt:a
, długość:l
. Jest rekurencyjny, nazywając siebie niższą iteracją z:a
zanegowanym kątem w dwóch przypadkach, aby uzyskać prawidłową orientację.rt :a
,lt :a
obróć żółwia (trójkąt, którego ścieżka jest wytyczona) w prawo, w lewo o:a
stopnie.fd :l
przesuwa żółwia krok po:l
kroku.Wreszcie, funkcja nazywa się:
h 5 90 9
. Żółw może być ukryte za dodatkowe 2 bajtachht
.źródło
ht
.Mathematica 128 bajtów
Jeśli chcesz, zamień 4 powyżej na inną liczbę iteracji.
Wykonano jako system Lindenmayera z sekwencjami liczb całkowitych zamiast ciągów znaków, więc druga reguła produkcyjna jest tylko przeczeniem pierwszej reguły. Ta wersja ma 151 bajtów.
Port kodu MATLAB Jonasa Lundgrena ma tylko 128 bajtów.
Widzę, że w przyszłej wersji Mathematica może to być naprawdę krótkie, coś w rodzaju:
http://mathworld.wolfram.com/HilbertCurve.html
źródło
LindenMASM , 63 bajtów
Kolejne pytanie z odpowiedzią LindenMASM? Niesamowite!
Ponownie, z powodu niektórych błędów rysowania w Pythonie
turtle
, czasami po uruchomieniu tego całego rysunku nie ma. Jak jednak widać, faktycznie działa:źródło