Tantangan
Diberi gambar raster warna * dengan lebar dan tinggi yang sama, menampilkan gambar yang diubah di bawah peta kucing Arnold . (* detail lihat di bawah)
Definisi
Mengingat ukuran gambar, N
kami mengasumsikan bahwa koordinat piksel diberikan sebagai angka antara 0
dan N-1
.
Peta kucing Arnold kemudian didefinisikan sebagai berikut:
Piksel pada koordinat [x,y]
dipindahkan ke [(2*x + y) mod N, (x + y) mod N]
.
Ini tidak lain adalah transformasi linear pada torus: Bagian kuning, ungu dan hijau dipetakan kembali ke kotak awal karena mod N
.
Peta ini (sebut saja f
) memiliki properti berikut:
Ini adalah kata sifat , itu berarti reversibel: Ini adalah transformasi linear dengan matriks
[[2,1],[1,1]]
. Karena memiliki determinan1
dan dan hanya memiliki entri bilangan bulat, kebalikannya juga hanya memiliki entri bilangan bulat dan diberikan oleh[[1,-1],[-1,2]]
, ini berarti ia juga bijektif pada koordinat bilangan bulat.Ini adalah elemen puntir dari kelompok peta bijektif
N x N
gambar, yang berarti jika Anda menerapkannya berkali-kali, Anda akan mendapatkan gambar asli kembali:f(f(...f(x)...)) = x
Jumlah kali peta diterapkan untuk dirinya sendiri menghasilkan identitas dijamin kurang atau sama dengan3*N
. Berikut ini Anda dapat melihat gambar kucing setelah sejumlah aplikasi iterated dari peta kucing Arnold , dan animasi seperti apa aplikasi yang berulang itu terlihat:
Detail
Program Anda tidak harus berurusan dengan gambar, tetapi 2D-array / matriks, string atau struktur 2D serupa juga dapat diterima.
Tidak masalah apakah
(0,0)
titik Anda ada di kiri bawah atau di kiri atas. (Atau di sudut lain, jika ini lebih nyaman dalam bahasa Anda.) Silakan tentukan konvensi apa yang Anda gunakan dalam kiriman Anda.
Testcases
Dalam bentuk matriks ( [1,2,3,4]
adalah baris teratas, 1
memiliki indeks (0,0)
, 2
memiliki indeks (1,0)
, 5
memiliki indeks (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
Seperti gambar (kiri bawah adalah (0,0)
):
Jawaban:
Jelly , 9 byte
Cobalah online! Koordinat seperti pada jawaban.
Penjelasan
Ini membungkus-geser matriks dalam satu arah, lalu yang lain.
sumber
MATL , 23 byte
The
(0,0)
point kiri atas, seperti pada contoh dalam teks tantangan.Cobalah online!
Penjelasan
Matriks dalam MATL dapat diindeks dengan satu indeks, bukan dua. Ini disebut pengindeksan linear , dan menggunakan urutan kolom-utama . Ini diilustrasikan oleh matriks 4 × 4 berikut, di mana nilai pada setiap entri bertepatan dengan indeks liniernya:
Ada dua pendekatan serupa untuk mengimplementasikan pemetaan dalam tantangan:
Bangun matriks pengindeksan yang mewakili pemetaan terbalik Arnold pada indeks linier, dan gunakan untuk memilih nilai dari matriks asli. Untuk kasus 4x4, matriks pengindeksan akan
mengatakan bahwa misalnya aslinya
5
di x = 2, y = 1 pergi ke x = 3, y = 2. Operasi ini disebut pengindeksan referensi : gunakan matriks pengindeksan untuk mengetahui elemen mana yang harus dipilih dari matriks asli. Ini adalah functon)
, yang mengambil dua input (dalam konfigurasi default-nya).Bangun matriks pengindeksan yang mewakili pemetaan langsung Arnold pada indeks linier, dan gunakan untuk menulis nilai ke dalam matriks asli. Untuk kasus 4x4, matriks pengindeksan akan
mengatakan bahwa entri x = 2, y = 1 dari matriks baru akan ditimpa ke entri dengan indeks linier
10
, yaitu, x = 3, y = 2. Ini disebut pengindeksan tugas : gunakan matriks pengindeksan, matriks data dan matriks asli, dan tulis data ke dalam matriks asli pada indeks yang ditentukan. Ini adalah fungsi(
, yang mengambil tiga input (dalam konfigurasi standarnya).Metode 1 lebih mudah, tetapi metode 2 ternyata lebih pendek.
sumber
Mathematica, 44 byte
Port dari algoritma Lynn yang fantastis . Ada karakter 3-byte yang tidak terlihat, U + F3C7 dalam pengkodean UTF-8, sebelum yang terakhir
]
; Mathematica menerjemahkannya sebagai superscriptT
, dan ia mengambil transpos dari sebuah matriks.Mathematica, 54 byte
Fungsi yang tidak disebutkan namanya mengambil dua argumen, bilangan bulat positif
#
dan array 2D#2
dimensi#
x#
, dan mengembalikan array 2D dengan bentuk yang sama. Seperti pada test case yang diberikan, titik dengan koordinat {0,0} berada di kiri atas dan sumbu x horizontal. Implementasi langsung menggunakan invers yang[[1,-1],[-1,2]]
disebutkan dalam pertanyaan, dengan-1
koordinat pertama untuk memperhitungkan fakta bahwa array secara inheren 1-diindeks dalam Mathematica. Jika kita tidak diizinkan untuk mengambil dimensi matriks sebagai argumen tambahan, maka solusi ini menjadi sembilan byte lebih lama (ganti yang pertama#
— bukan yang#2
— dengana=Length@#
dan semua yang berikutnya#
dengana
s).sumber
Python 2,
89827773 byteInput adalah daftar daftar
. String di dalam eksekutif mengubah posisi daftar dan memutar setiap daftar secara berurutan dengan indeks garis (0 berbasis - baris 3 diputar 2 kali ke kanan).
Proses ini dilakukan 2 kali untuk input.
+4 byte yang akan melakukan transformasi N kali
sumber
Haskell, 55 byte
Contoh penggunaan:
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] # 4
->[[1,14,11,8],[12,5,2,15],[3,16,9,6],[10,7,4,13]]
.0,0
adalah sudut kiri atas. Ini menggunakan transformasi terbalik.sumber
Python, 69 byte
Peningkatan pada metode transpos-dan-shift-dua kali Rod . Terapkan operasi
M -> [r[-i:]+r[:-i]for i,r in enumerate(zip(*M))]
dua kali dengan membuat dan mengevaluasi stringIni secara sempit mengalahkan transformasi langsung (70 byte), dengan asumsi gambar berbentuk bujur sangkar dan panjangnya dapat diambil sebagai input:
sumber
ImageJ macro, 29 byte
sumber
v=getPixel((2*y-x)%w,(x-y)%h)
.2*x+y
berubah menjadi2*y+x
f(x,y) = (2x+y, x+y)
transformasi terbalik ini dijelaskan olehf^(-1) = (x-y, 2y-x)
. (Komentar saya yang lain salah.) Jadi kodenya sudah jadiv=getPixel((x-y)%w,(2*y-x)%h)
.Java, 160
Golf:
Tidak Disatukan:
sumber