Sfida
Data un'immagine raster a colori * con la stessa larghezza e altezza, produce l'immagine trasformata sotto la mappa del gatto di Arnold . (* dettagli vedi sotto)
Definizione
Data la dimensione dell'immagine N
, supponiamo che le coordinate di un pixel siano indicate come numeri tra 0
e N-1
.
La mappa dei gatti di Arnold viene quindi definita come segue:
Un pixel alle coordinate [x,y]
viene spostato in [(2*x + y) mod N, (x + y) mod N]
.
Questo non è altro che una trasformazione lineare sul toro: la parte gialla, viola e verde viene mappata sul quadrato iniziale a causa del mod N
.
Questa mappa (chiamiamola f
) ha le seguenti proprietà:
È biiettivo , ciò significa reversibile: è una trasformazione lineare con la matrice
[[2,1],[1,1]]
. Poiché ha determinante1
e ha solo voci intere, anche l'inverso ha solo voci intere ed è dato da[[1,-1],[-1,2]]
, ciò significa che è anche biiettivo su coordinate intere.È un elemento di torsione del gruppo di mappe biiettive di
N x N
immagini, il che significa che se lo applichi abbastanza volte, otterrai di nuovo l'immagine originale:f(f(...f(x)...)) = x
la quantità di volte in cui la mappa applicata a se stessa risulta nell'identità è garantita essere inferiore o uguale a3*N
. Di seguito puoi vedere l'immagine di un gatto dopo un determinato numero di applicazioni iterate della mappa del gatto di Arnold e un'animazione di come appare un'applicazione ripetuta:
Dettagli
Il tuo programma non ha necessariamente a che fare con immagini, ma sono accettabili anche array / matrici 2D, stringhe o strutture 2D simili.
Non importa se il
(0,0)
punto è in basso a sinistra o in alto a sinistra. (O in qualsiasi altro angolo, se è più conveniente nella tua lingua.) Specifica quale convenzione usi nella tua presentazione.
Casi test
In forma di matrice ( [1,2,3,4]
è la riga superiore, 1
ha indice (0,0)
, 2
ha indice (1,0)
, 5
ha indice (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
Come immagine (in basso a sinistra (0,0)
):