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.

