Desafio
Dada uma imagem raster colorida * com a mesma largura e altura, produza a imagem transformada no mapa de gatos de Arnold . (* detalhes veja abaixo)
Definição
Dado o tamanho da imagem N
, assumimos que as coordenadas de um pixel são dadas como números entre 0
e N-1
.
O mapa de gatos de Arnold é então definido da seguinte forma:
Um pixel nas coordenadas [x,y]
é movido para [(2*x + y) mod N, (x + y) mod N]
.
Isso não passa de uma transformação linear no toro: a parte amarela, violeta e verde é mapeada de volta para o quadrado inicial devido ao mod N
.
Este mapa (vamos chamá-lo f
) possui as seguintes propriedades:
É bijetivo , isso significa reversível: é uma transformação linear com a matriz
[[2,1],[1,1]]
. Como tem determinante1
ee possui apenas entradas inteiras, o inverso também possui apenas entradas inteiras e é dado por[[1,-1],[-1,2]]
, isso significa que também é bijetivo nas coordenadas inteiras.É um elemento de torção do grupo de mapas de
N x N
imagens bijetivos , ou seja, se você o aplicar o suficiente, você receberá a imagem original de volta:f(f(...f(x)...)) = x
A quantidade de vezes que o mapa aplicado a si próprio resulta na identidade é garantida como menor ou igual a3*N
. A seguir, é possível ver a imagem de um gato após um determinado número de aplicativos iterados do mapa de gatos de Arnold e uma animação de como é um aplicativo repetido:
Detalhes
Seu programa não precisa necessariamente lidar com imagens, mas matrizes / matrizes 2D, strings ou estruturas 2D similares também são aceitáveis.
Não importa se o seu
(0,0)
ponto está no canto inferior esquerdo ou no canto superior esquerdo. (Ou em qualquer outro canto, se isso for mais conveniente no seu idioma.) Especifique qual convenção você usa ao enviar.
Casos de teste
Em forma de matriz ( [1,2,3,4]
é a linha superior, 1
tem índice (0,0)
, 2
tem índice (1,0)
, 5
tem índice (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
Como imagem (canto inferior esquerdo (0,0)
):