Wyzwanie
Biorąc pod uwagę kolorowy obraz rastrowy * o tej samej szerokości i wysokości, wydrukuj obraz przekształcony pod mapą kota Arnolda . (* szczegóły patrz poniżej)
Definicja
Biorąc pod uwagę rozmiar obrazu N
, zakładamy, że współrzędne piksela są podane jako liczby pomiędzy 0
i N-1
.
Mapa kota Arnolda jest następnie definiowana w następujący sposób:
Piksel o współrzędnych [x,y]
jest przenoszony do [(2*x + y) mod N, (x + y) mod N]
.
To nic innego jak liniowa transformacja torusa: część żółta, fioletowa i zielona są odwzorowywane z powrotem na początkowy kwadrat z powodu mod N
.
Ta mapa (nazwijmy ją f
) ma następujące właściwości:
Jest bijectywny , co oznacza odwracalne: jest to transformacja liniowa z matrycą
[[2,1],[1,1]]
. Ponieważ ma on wyznacznik1
i ma tylko wpisy liczb całkowitych, odwrotność ma także tylko wpisy liczb całkowitych i jest podany przez[[1,-1],[-1,2]]
, co oznacza, że jest również brzemienny we współrzędne liczb całkowitych.Jest to element skrętny grupy bijectywnych map
N x N
obrazów, co oznacza, że jeśli zastosujesz go wystarczająco wiele razy, odzyskasz oryginalny obraz:f(f(...f(x)...)) = x
Ilość przypadków, w których mapa zastosowana do siebie daje w wyniku tożsamość, jest mniejsza lub równa3*N
. Poniżej możesz zobaczyć obraz kota po określonej liczbie iterowanych aplikacji mapy kota Arnolda oraz animację tego, jak wygląda powtarzana aplikacja:
Detale
Twój program niekoniecznie musi radzić sobie z obrazami, ale akceptowalne są również tablice / macierze 2D, łańcuchy lub podobne struktury 2D.
Nie ma znaczenia, czy Twój
(0,0)
punkt znajduje się w lewym dolnym rogu, czy w lewym górnym rogu. (Lub w dowolnym innym rogu, jeśli jest to wygodniejsze w Twoim języku.) Proszę określić, jakiej konwencji używasz w swoim zgłoszeniu.
Przypadki testowe
W postaci macierzy ( [1,2,3,4]
jest górnym wierszem, 1
ma indeks (0,0)
, 2
ma indeks (1,0)
, 5
ma indeks (0,1)
)
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
maps to:
1 14 11 8
12 5 2 15
3 16 9 6
10 7 4 13
--------------------
1 2 3
4 5 6
7 8 9
map to:
1 8 6
9 4 2
5 3 7
Jak obrazek (u dołu po lewej (0,0)
):