Zainspirowany tym pytaniem
Innym sposobem na rozwinięcie obrazu 2D w ciąg 1D jest użycie krzywej Hilberta.
Istnieje wiele wersji tej krzywej, w zależności od liczby iteracji użytych podczas jej obliczania. Poniżej przykład krzywych Hilberta od pierwszego rzędu do piątego rzędu.
Sposób obliczenia tej krzywej jest następujący. Najpierw definiujemy Krzywą Hilberta pierwszego rzędu jako pokazaną na rysunku (tę dla n = 1), tak aby pasowała do kwadratu 1x1. Następnie wykonujemy cztery kopie tej krzywej, rozmieszczając je w kwadracie 4x4, tak aby wszystkie prezentowały „wklęsłość” w kierunku lewej strony. Następnie odwracamy dwie krzywe 1 rzędu w lewo, tak aby wklęsłość górna skierowana była ku górze, a dno skierowane w dół. W końcu łączymy rogi sąsiednich krzywych Hilberta. Jeśli chcemy uzyskać krzywą uporządkowania (n + 1), wystarczy powtórzyć proces z czterema krzywymi rzędu n. Możemy zobaczyć wizualizację procesu tutaj (będę również dodać obraz szczegółowo proces wkrótce)
Twoim zadaniem w tym wyzwaniu jest rozwinięcie macierzy liczb całkowitych wzdłuż najniższej kolejności krzywej Hilberta dla tej macierzy.
Dla uproszczenia krzywą zaczynamy od lewego górnego rogu matrycy.
Możesz otrzymać dane wejściowe jako listę liczb całkowitych, gdzie każda lista podrzędna reprezentuje wiersz macierzy.
Możesz założyć, że wejście będzie macierzą kwadratową (n * n).
Na przykład:
Wejście:
[[ 1, 2,]
[ 3, 4 ]]
Wynik:
[ 1, 2, 4, 3 ]
Ponieważ używamy krzywej Hilberta pierwszego rzędu pokazanej na rysunku
Wejście:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Wynik:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Korzystanie z krzywej Hilberta drugiego rzędu
Jak zwykle standardowe luki nie są dozwolone.
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
źródło
Odpowiedzi:
MATL ,
8685 bajtówTo rozwiązanie jest oparte na wpisie wymiany plików Jonasa Lundgrena, który wykorzystuje liczby zespolone do wygenerowania krzywej Hilberta. Te liczby zespolone są następnie konwertowane na wartości indeksu, aby pobrać elementy macierzy, które opadają wzdłuż krzywej.
Wypróbuj online!
Wyjaśnienie
źródło
APL (Dyalog Unicode) , 41 bajtów SBCS
Zaoszczędzono 30 bajtów (!), Sprawdzając mądrość sadu APL, zwłaszcza @ngn i @ Sherlock9.
Wypróbuj online!
Wyjaśnienie w następujący sposób:
Więcej informacji na temat „ monadycznego skanowania transpozycji ”.
Dokumentacja Dyalog na temat zabezpieczeń przed błędami .
źródło
Mathcad, 302 bajty
Poniższy program Mathcad jest oparty na programie Python @ Sherlock9. Różni się tym, że krzywizuje prostokątne macierze, ignorując te części Krzywej Hilberta, które leżą poza granicami macierzy. Zauważ, że ponieważ Mathcad ma stosunkowo słabą obsługę ciągów, zamapowałem symbole Lindenmayera na liczby całkowite w funkcji Hilberta.
Mathcad działa poprzez interfejs 2D, który pozwala użytkownikowi umieszczać (i dowolnie miksować) wyrażenia matematyczne, wykresy, tekst, dane wejściowe i wyjściowe. Zrównowałem bajt z operacją odpowiadającą minimalnej klawiaturze użytkownika, aby utworzyć symbol (na przykład operator definicji (: =) wprowadza się po prostu wpisując:.
źródło
Python 3,
327289275271239234 bajtówJest to rozwiązanie, które zmodyfikowałem z odpowiedzi na inne pytanie krzywej Hilberta tutaj . Wszelkie wskazówki dotyczące gry w golfa są mile widziane.
Edycja: Zmieniono sposób
g
zwiększania i zmniejszania. Teraz za pomocąeval()
istr.translate
. Już nie używal=len(s)
.Nie golfowany:
źródło
Wolfram - 233
W oparciu o reprezentację jako system Lindenmayera :
źródło
Rubinowy,
224221216 bajtówTa odpowiedź jest oparta na mojej odpowiedzi w języku Python .
Ungolfing:
źródło
CJam, 60
Wypróbuj online
Wyjaśnienie:
Fraktal buduję jako serię kierunków ruchu: 0 = prawo, 1 = dół, 2 = lewo, 3 = góra.
źródło