Rotasi Interlaced

25

Tantangan

Dengan matriks karakter persegi (karakter ASCII satu-byte yang dapat dicetak), putar setiap "cincin" matriks ke arah yang berlawanan.

Mari kita ambil contoh:

1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J K
L M N O P

Kemudian, cincin terluar diputar searah jarum jam 90 derajat, seperti:

1 2 3 4 5    L G B 6 1
6       A    M       2
B       F => N       3
G       K    O       4
L M N O P    P K F A 5

Cincin kedua diputar berlawanan arah 90 derajat:

7 8 9    9 E J
C   E => 8   I
H I J    7 C H

Cincin terakhir diputar searah jarum jam 90 derajat, tetapi karena ini adalah nomor tunggal (huruf dalam contoh kita), maka tidak benar-benar terpengaruh.

Hasil akhirnya adalah:

L G B 6 1
M 9 E J 2
N 8 D I 3
O 7 C H 4
P K F A 5

Jika matriks memiliki panjang sisi yang rata, cincin terdalam akan berukuran 2x2 persegi dan harus tetap diputar.

Memasukkan

Daftar daftar dalam format standar apa pun yang masuk akal. Misalnya, string yang dibatasi ruang-batas baru atau daftar string yang dibatasi-ruang dapat diterima, tetapi daftar nilai-nilai sebagai cincin di sekitar matriks tidak dapat diterima. Karakter tidak harus unik.

Keluaran

Daftar daftar dalam format standar apa pun yang masuk akal. Aturan yang sama dengan input.

Uji Kasus

1 2 3    7 4 1
4 5 6 => 8 5 2
7 8 9    9 6 3

1 2 3 4 5 6    Y S M G A 1
A B C D E F    Z E K Q W 2
G H I J K L => ! D O I V 3
M N O P Q R    @ C P J U 4
S T U V W X    # B H N T 5
Y Z ! @ # $    $ X R L F 6

Kredit

Sangat terilhami oleh tantangan terkait yang memutar setiap elemen berlawanan arah satu posisi (bukan 90 derajat).

HyperNeutrino
sumber
Terkait
rahnema1
@ Rahnema1 Benar, saya ingat posting itu. Posting ini sebagian besar terinspirasi oleh yang itu; Saya akan kredit. Terima kasih!
HyperNeutrino
@ Mr.Xcoder Whoops. Anda benar, terima kasih.
HyperNeutrino
@HyperNeutrino dapatkah kita mengambil dimensi matriks sebagai bagian dari input?
Uriel
Semua karakter dalam contoh Anda unik. Akankah ini selalu terjadi?
Dennis

Jawaban:

9

Haskell , 94 byte

Fungsi anonim mengambil dan mengembalikan daftar Strings.

Gunakan sebagai (cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"].

(cycle[t.r,r.t,r.t,r.t]?)
(g:h)?(a:b)=g$a:h?t(r b)
_?a=a
r=reverse;t=zipWith(:)`foldr`repeat[]

Cobalah online!

Bagaimana itu bekerja

  • radalah reverse. tlebih pendek satu byte daripada mengimpor Data.List.transpose. t.rmemutar daftar 90 derajat searah jarum jam, dan r.tmemutarnya berlawanan arah jarum jam.
  • Operator ?mengambil dua argumen, daftar fungsi dan matriks sebagai daftar string.
    • Matriks kosong baru saja dikembalikan.
    • Jika tidak, hapus ?fungsi pertama fdari daftar fungsi, dan baris pertama adari matriks.
    • Kemudian ia memutar sisa bdari matriks searah jarum jam, dan berulang dengan itu dan fungsi yang tersisa. Ini secara bertahap strip matriks dari luar ke dalam, satu cincin setiap empat langkah.
    • Kemudian ia menambahkan baris asli ake hasilnya, dan menerapkan fungsinya funtuk menyesuaikan orientasi matriks.
  • Fungsi anonim memanggil ?dengan matriks input sebagai daftar string, dan daftar fungsi yang tak terbatas, yang berulang secara siklus setiap empat langkah.
    • Untuk sebagian besar langkah fungsi ini adalah rotasi berlawanan arah jarum jam, yang membatalkan rotasi searah jarum jam yang dilakukan oleh ?saat berulang.
    • Namun, langkah pertama dan setiap langkah keempat setelahnya adalah rotasi searah jarum jam.
      • Fungsi ini diterapkan ketika cincin dari matriks selesai, menyebabkan setiap cincin menjadi 180 derajat diputar sehubungan dengan yang berikutnya.
      • Untungnya, ini juga merupakan transformasi yang tepat untuk diterapkan pada matriks akhir yang telah selesai untuk mendapatkan hasil akhir.
Ørjan Johansen
sumber
6

Python 2 , 104 byte

def f(x):l=len(x)-1;r=range(l+1);return[[[x[l-i][j],x[i][l-j]][min(i,j,l-i,l-j)%2]for i in r]for j in r]

Cobalah online!

x[l-i][j]adalah koordinat dari belokan searah jarum jam, x[i][l-j]untuk putaran berlawanan arah jarum jam. min(i,j,l-i,l-j)%2digunakan untuk memilih arah yang benar

tongkat
sumber
mengembalikan rotasi secara rekursif.
tuskiomi
@tuskiomi hmm ??
Rod
@tuskiomi Saya mencoba pendekatan rekursif di ES6. Itu sekitar dua kali lebih lama sebagai port sederhana dari jawaban ini ...
Neil
4

Mathematica, 113 byte

r=Reverse;(l=Length[s=#];Table[s[[i+1;;l-i,i+1;;l-i]]=r/@r@s[[i+1;;l-i,i+1;;l-i]],{i,⌊l/2⌋}];r/@Transpose@s)&


lebih baik untuk memasukkan string char seperti "E" untuk huruf khusus seperti E, saya ...

memasukkan

[{{1, 2, 3, 4, 5, 6}, {A, B, C, D, "E", F}, {G, H, "I", J, K, L}, {M , N, O, P, Q, R}, {S, T, U, V, W, X}, {Y, Z, "!", "@", "#", "&"}}]

keluaran

{{Y, S, M, G, A, 1}, {Z, "E", K, Q, W, 2}, {"!", D, O, "I", V, 3}, { "@", C, P, J, U, 4}, {"#", B, H, N, T, 5}, {"&", X, R, L, F, 6}}

J42161217
sumber
3

Oktaf, 86 byte

@(a){k=a;k(x=2:end-1,x)=0;a=rot90(a);a(m)=rot90(a,-2)(m=~mod(bwdist(+k,'ch'),2));a}{5}

Cobalah online!

rahnema1
sumber