Défi
Étant donné une image raster couleur * avec la même largeur et la même hauteur, sortez l'image transformée sous la carte de chat d'Arnold . (* détails voir ci-dessous)
Définition
Étant donné la taille de l'image, Nnous supposons que les coordonnées d'un pixel sont données sous forme de nombres entre 0et N-1.
La carte du chat d'Arnold est alors définie comme suit:
Un pixel aux coordonnées [x,y]est déplacé vers [(2*x + y) mod N, (x + y) mod N].
Ce n'est rien d'autre qu'une transformation linéaire sur le tore: les parties jaune, violette et verte sont remappées sur le carré initial en raison de la mod N.
Cette carte (appelons-la f) a les propriétés suivantes:
- C'est bijectif , c'est-à-dire réversible: c'est une transformation linéaire avec la matrice - [[2,1],[1,1]]. Comme il a un déterminant- 1et qu'il n'a que des entrées entières, l'inverse n'a également que des entrées entières et est donné par- [[1,-1],[-1,2]], cela signifie qu'il est également bijectif sur les coordonnées entières.
- Il s'agit d'un élément de torsion du groupe de cartes d' - N x Nimages bijectives , ce qui signifie que si vous l'appliquez suffisamment de fois, vous récupérerez l'image d'origine:- f(f(...f(x)...)) = xle nombre de fois où la carte appliquée à elle-même se traduit par l'identité est garanti inférieur ou égal à- 3*N. Dans ce qui suit, vous pouvez voir l'image d'un chat après un nombre donné d'applications itérées de la carte de chat d' Arnold , et une animation de ce à quoi ressemble une application répétée:
 

Détails
- Votre programme ne doit pas nécessairement traiter d'images, mais les matrices / matrices 2D, les chaînes ou les structures 2D similaires sont également acceptables. 
- Peu importe que votre - (0,0)point soit en bas à gauche ou en haut à gauche. (Ou dans tout autre coin, si cela est plus pratique dans votre langue.) Veuillez spécifier la convention que vous utilisez dans votre soumission.
Cas de test
Sous forme matricielle ( [1,2,3,4]est la ligne supérieure, 1a un index (0,0), 2a un index (1,0), 5a un index (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
Comme image (en bas à gauche (0,0)):

