Herausforderung
Wenn Sie ein Farbrasterbild * mit der gleichen Breite und Höhe erhalten, geben Sie das Bild transformiert unter Arnolds Katzenkarte aus . (* Details siehe unten)
Definition
Bei der Größe des Bildes N
nehmen wir an, dass die Koordinaten eines Pixels als Zahlen zwischen 0
und angegeben werden N-1
.
Arnolds Katzenkarte wird dann folgendermaßen definiert:
Ein Pixel an Koordinaten [x,y]
wird nach verschoben [(2*x + y) mod N, (x + y) mod N]
.
Dies ist nichts anderes als eine lineare Transformation auf dem Torus: Der gelbe, violette und grüne Teil werden aufgrund von auf das Anfangsquadrat zurück abgebildet mod N
.
Diese Karte (nennen wir sie f
) hat folgende Eigenschaften:
Es ist bijektiv , das heißt reversibel: Es ist eine lineare Transformation mit der Matrix
[[2,1],[1,1]]
. Da es eine Determinante hat1
und nur ganzzahlige Einträge hat, hat das Inverse auch nur ganzzahlige Einträge und ist gegeben durch[[1,-1],[-1,2]]
, dh es ist auch bijektiv für ganzzahlige Koordinaten.Es ist ein Torsionselement der Gruppe der bijektiven Karten von
N x N
Bildern, dh wenn Sie es ausreichend oft anwenden, erhalten Sie das Originalbild zurück:f(f(...f(x)...)) = x
Die Häufigkeit, mit der die Karte auf sich selbst angewendet wird, führt garantiert zu einer geringeren Identität oder gleich3*N
. Im Folgenden sehen Sie das Bild einer Katze nach einer bestimmten Anzahl iterierter Anwendungen von Arnolds Katzenkarte und eine Animation, wie eine wiederholte Anwendung aussieht:
Einzelheiten
Ihr Programm muss sich nicht unbedingt mit Bildern befassen, aber auch 2D-Arrays / Matrizen, Strings oder ähnliche 2D-Strukturen sind akzeptabel.
Es spielt keine Rolle, ob sich Ihr
(0,0)
Punkt links unten oder links oben befindet. (Oder in einer anderen Ecke, wenn dies in Ihrer Sprache praktischer ist.) Bitte geben Sie an, welche Konvention Sie in Ihrer Einreichung verwenden.
Testfälle
In Matrixform ( [1,2,3,4]
ist die oberste Zeile, 1
hat Index(0,0)
, 2
hat Index (1,0)
, 5
hat 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
Als Bild (links unten ist (0,0)
):