Виклик
Давши кольорове растрове зображення * з однаковою шириною та висотою, виведіть зображення, трансформоване під мапу кота Арнольда . (* деталі див. нижче)
Визначення
Враховуючи розмір зображення, 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)
точка знаходиться внизу зліва або вгорі зліва. (Або в будь-якому іншому куточку, якщо це зручніше для вашої мови.) Будь ласка, вкажіть, яку умову ви використовуєте у своєму поданні.
Тестові шафи
У матричній формі ( [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)
):