Вызов
Учитывая цветное растровое изображение * с той же шириной и высотой, выведите изображение, преобразованное под карту кота Арнольда . (* подробности см. ниже)
Определение
Учитывая размер изображения, N
мы предполагаем, что координаты пикселя даны как числа между 0
и N-1
.
Карта кота Арнольда определяется следующим образом:
Пиксель с координатами [x,y]
перемещен в [(2*x + y) mod N, (x + y) mod N]
.
Это не что иное, как линейное преобразование на торе: желтая, фиолетовая и зеленая части возвращаются на начальный квадрат благодаря mod N
.
Эта карта (назовем ее f
) имеет следующие свойства:
Это биективно , что означает обратимость: это линейное преобразование с матрицей
[[2,1],[1,1]]
. Поскольку он имеет определитель1
и имеет только целочисленные записи, обратное также имеет только целочисленные записи и определяется как[[1,-1],[-1,2]]
, это означает, что он также является биективным по целочисленным координатам.Это элемент кручения группы биективных карт
N x N
изображений, что означает, что если вы примените его достаточно много раз, вы вернете исходное изображение:f(f(...f(x)...)) = x
количество раз, когда карта, примененная к себе, приводит к идентичности, гарантированно будет меньше или равно3*N
. Далее вы можете увидеть изображение кота после заданного числа повторяющихся приложений карты кота Арнольда и анимацию того, как выглядит повторяющееся приложение:
Детали
Ваша программа не обязательно должна иметь дело с изображениями, но 2D-массивы / матрицы, строки или аналогичные 2D-структуры также приемлемы.
Неважно, находится ли ваша
(0,0)
точка слева внизу или слева вверху. (Или в любом другом углу, если это более удобно на вашем языке.) Пожалуйста, укажите, какое соглашение вы используете в своем представлении.
Testcases
В матричной форме ( [1,2,3,4]
верхний ряд, 1
индекс (0,0)
, 2
индекс (1,0)
, 5
индекс (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
Как изображение (внизу слева (0,0)
):