Lubię krzywą Hilberta .
Twoim zadaniem w tym wyzwaniu jest zrobienie zdjęcia (dokładnie kwadratowego obrazu, którego wszystkie boki mają moc dwóch pikseli szerokości) i rozplątanie go linia po linii w zygzakowaty sposób i wbicie go z powrotem w pseudo-krzywą Hilberta .
Rozplątywanie
Aby rozwikłać, zacznij od piksela w lewym górnym rogu i podróżuj w prawo, aż dojdziesz do krawędzi obrazu. Po uderzeniu w krawędź obrazu przejdziesz do następnego rzędu i zaczniesz jechać w lewo, aż ponownie dotkniesz krawędzi. Będziesz kontynuował rozplątywanie rząd po rzędzie za każdym razem zmieniając kierunek, aby uzyskać jedną ciągłą krzywą. Powinno to wyglądać jak dobrze zagrana gra w węża
Wynikiem rozwikłania powinna być kolejność pikseli, która obejmuje każdy piksel dokładnie raz
Reraveling
Po otrzymaniu zamówienia na piksele przestawisz je na nowe płótno o równej wielkości, podążając ścieżką pseudo-krzywej Hilberta. W przypadku 2**n
kwadratowego obrazu o wielkości należy użyć n-tej iteracji krzywej pseudo-Hilberta. Każdy piksel zostanie umieszczony w dokładnie jednym miejscu na nowym płótnie. Powinieneś odwrócić obraz, aby punkt pierwotnie w lewym górnym rogu (początek naszej krzywej węża) pozostał tam i punkt w prawym dolnym rogu (koniec naszej krzywej węża) został umieszczony w prawym górnym rogu.
I / O
Twój program lub funkcja powinna pobrać obraz określonych ograniczeń standardowymi metodami i wygenerować inny obraz standardowymi metodami.
Punktacja
Jest to program do gry w golfa z najmniejszą liczbą bajtów wygranych.
Przykłady
Wkład
Wydajność
Wkład
Wydajność
Wkład
Wydajność
Polecam również testowanie na pustym białym lub jednolitym kolorze obrazu, aby upewnić się, że nie brakuje żadnych pikseli.
Dołącz swoje wyniki do swoich odpowiedzi!
źródło
Odpowiedzi:
Mathematica,
286273 bajtówUff! Trudne, ale zabawne!
Wyjaśnienie
Konwertuj an
Image
na tablicę wartości RGB.Wygenerowania
l
przezl
tablicę z głowicy1
, w którejl
jest długością wejścia (tj szerokość obrazu).Daje to
{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}
(l
zapisane wielkimi literami, aby zmniejszyć zamieszanie)StringReplace
Funkcja, która zastępuje każdy"L"
z"+RF-LFL-FR+"
oraz"R"
z"-LF+RFR+FL-"
Zastosuj
StringReplace
funkcję doString
"L"
,Log2[l]
razy.Przekształć wynik
String
w postaciList
znaków.Nienazwana funkcja, która:
"-"
, pomnóż drugi element pierwszego wejścia przezI
."+"
, podziel drugi element pierwszego wejścia przezI
."F"
, zwiększ pierwsze wejście oReIm
(oddziela rzeczywistą i urojoną część wejścia) drugiego wejścia.Zaczynając od
{{1,1},I}
, zastosuj łącznie powyższą nienazwaną funkcję, używając każdego elementuList
znaków jako drugiego wejścia. Ten kod zwraca wyniki wszystkich iteracji.Pozbądź się drugich elementów każdego z nich
List
i usuń duplikaty. (Kroki do tego punktu generująList
współrzędne krzywej Hilberta)Rozwiń wejściową tablicę RGB (odwraca co drugi rząd i spłaszcza).
Utwórz
Rule
obiekty, tak aby pierwszy element na pierwszym wejściu (współrzędne krzywej Hilberta) został sparowany z pierwszym elementem na drugim wejściu (rozpleciony obraz), drugim elementem z drugim wejściem i tak dalej.Stosować te zamienne
Rule
do danegoArray
z drugiego etapu.Konwertuj na tablicę wartości RGB na an
Image
.Próbkuj wejście / wyjście
Wkład:
Wydajność:
Wkład:
Wydajność:
Funkcja odwrotna (
266253 bajtów)źródło
Oktawa 234 bajtów
Nazwy plików obrazów wejściowych i wyjściowych należy podać ze standardowego wejścia. rozmiar kodu bez wejścia / wyjścia wynosi 194 bajty .
Wyjaśnienie:
Podstawowym wzorem indeksów jest:
W każdej iteracji 4 kopie z wyniku poprzedniej wykonanej iteracji i niektóre transformacje zastosowane do każdej kopii, a następnie wszystkie bloki połączone w celu utworzenia bieżącego wyniku.
więc mamy:
Posortowane indeksy Hilberta i zwrócone indeksy posortowanych elementów:
Rozplątywanie zastosowano odwracanie wszystkich parzystych wierszy:
Zastosowano ponowne znakowanie:
-S powtórzone dla każdego kanału
-permutacja zastosowana, ponieważ w danych Octave ułożono kolumnę
Przykładowe obrazy:
źródło