Tornado matriks sama seperti tornado lainnya: ia terdiri dari benda-benda yang berputar di sekitar pusat. Dalam hal ini, elemen-elemen dari matriks bukan udara.
Berikut adalah contoh tornado matriks:
Pertama kita mulai dengan membagi matriks menjadi cincin persegi, setiap bagian terdiri dari elemen yang lebih jauh dari perbatasan dengan jarak yang sama. Bagian-bagian ini akan diputar searah jarum jam di sekitar tengah. Dalam tornado nyata, tingkat keparahan meningkat ke arah pusat, dan begitu juga langkah rotasi dalam tornado matriks: bagian terluar (yang merah) diputar oleh 1 langkah, yang berikutnya (kuning) diputar oleh 2, dan seterusnya di. Langkah rotasi adalah rotasi 90 ° di sekitar pusat.
Tugas:
Tugas Anda, jika Anda menerimanya, adalah menulis fungsi atau program yang mengambil sebagai input matriks kuadrat, menerapkan efek tornado padanya dan kemudian output matriks yang dihasilkan.
Memasukkan:
Input harus berupa matriks kuadrat pesanan di n
mana n >= 1
. Tidak ada asumsi yang dibuat tentang elemen-elemen matriks, mereka bisa apa saja.
Keluaran:
Matriks kuadrat dari urutan yang sama yang akan menjadi hasil menerapkan efek tronado ke matriks input.
Contoh:
Matriks pesanan n = 1
:
[['Hello']] ===> [['Hello']]
Matriks pesanan n = 2
:
[[1 , 2], ===> [[5 , 1],
[5 , 0]] [0 , 2]]
Matriks pesanan n = 5
:
[[A , B , C , D , E], [[+ , 6 , 1 , F , A],
[F , G , H , I , J], [- , 9 , 8 , 7 , B],
[1 , 2 , 3 , 4 , 5], ===> [/ , 4 , 3 , 2 , C],
[6 , 7 , 8 , 9 , 0], [* , I , H , G , D],
[+ , - , / , * , %]] [% , 0 , 5 , J , E]]
;)
Jawaban:
Python 3 , 100 byte
Cobalah online!
sumber
a[1:-1,1:-1]=f(a[1:-1,1:-1])
seperti itu adalah hal yang paling normal di dunia untuk secara langsung mendapatkan dan mengatur seluruh bagian dalam array 2 dimensinumpy
numpy.rot90(a,1,(1,0))
lebih pendek 3 byte dan juga harus berfungsi.if len(a):a=...
-1 byte).Arang , 44 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Hanya bekerja pada kotak karakter karena standar I / O Charcoal tidak melakukan keadilan array normal. Penjelasan:
Baca kotak karakter.
Loop sampai kosong.
Putar itu.
Cetak, tapi kemudian pindahkan kursor ke satu persegi secara diagonal dari sudut aslinya.
Potong bagian luar dari array.
sumber
Jelly , 27 byte
Cobalah online!
Saya pikir ini bisa menjadi jauh lebih pendek.
sumber
µG
footer dan mengklaim bahwa kiriman Anda adalah 25.Perl 6 ,
78 7372 byteTerima kasih kepada nwellnhof untuk -5 byte!
Cobalah online!
Blok kode rekursif yang mengambil array 2D yang diratakan dan mengembalikan array yang rata pula.
Penjelasan:
sumber
@a[*;*]
alih-alihmap |*,@a
untuk meratakan array. (Alangkah baiknya jika ada cara untuk bekerja dengan array yang tidak rata dan subskrip multi-dimensi, tapi saya tidak bisa memikirkannya.)@a[1..*-2;1..@a-2].=$!
berhasil.Oktaf ,
8681 byteCobalah online!
Saya sadar bahwa fungsi anonim rekursif bukan metode terpendek untuk melakukan sesuatu di Octave, tetapi mereka yang paling sejauh ini menyenangkan . Ini adalah fungsi anonim terpendek yang bisa saya buat, tapi saya ingin dikalahkan.
Penjelasan
Fungsi rekursif didefinisikan menurut ini kiat jawaban oleh ceilingcat.
q=f(f=@(g)@(M) ... g(g)(M) ...
adalah struktur dasar dari fungsi anonim seperti itu, dengang(g)(M)
panggilan rekursif. Karena ini akan berulang tanpa batas, kami membungkus panggilan rekursif dalam array sel bersyarat:{@()g(g)(M),M}{condition}()
. Fungsi anonim dengan daftar argumen kosong menunda evaluasi setelah kondisi telah dipilih (meskipun nanti, kita melihat bahwa kita dapat menggunakan daftar argumen untuk mendefinisikanz
). Sejauh ini baru pembukuan dasar.Sekarang untuk pekerjaan yang sebenarnya. Kami ingin fungsi kembali
rot90(P,-1)
dengan matriks P yangg(g)
telah secara rekursif dipanggil pada bagian tengah M. Kami mulai dengan menetapkanz=2:end-1
yang dapat kita sembunyikan dalam pengindeksan M. Dengan cara ini,M(z,z)
memilih bagian tengah dari matriks yang perlu tornado lebih lanjut dengan panggilan rekursif. Bagian ini,3
memastikan bahwa rotasi searah jarum jam. Jika Anda tinggal di belahan bumi selatan, Anda dapat menghapus bit ini untuk -2 byte.Kami kemudian melakukannya
M(z,z)=g(g)M(z,z)
. Namun, nilai hasil operasi ini hanya bagian tengah yang dimodifikasi daripada seluruhP
matriks. Karenanya, kami melakukan{M(z,z)=g(g)M(z,z),M}{2}
yang pada dasarnya dicuri dari tips ini jawaban oleh Stewie Griffin.Akhirnya,
condition
hanya saja rekursi berhenti ketika input kosong.sumber
R , 87 byte
Cobalah online!
sumber
seq(0.5)
mengembalikan 1 bukannya vektor kosong)MATL ,
25 24 2322Cobalah online!
Mengindeks dalam MATL tidak pernah mudah, tetapi dengan bermain golf itu sebenarnya mengalahkan jawaban Jelly terbaik saat ini ...
* Untuk
n x n
matriks, program ini melakukann
iterasi, sementara Anda benar-benar hanya perlun/2
rotasi. Namun, pengindeksan dalam MATL (AB) cukup fleksibel sehingga pengindeksan rentang yang mustahil hanyalah sebuah larangan. Dengan cara ini, tidak perlu membuang byte untuk mendapatkan jumlah iterasi yang tepat.sumber
Python 2 , 98 byte
Cobalah online!
sumber
K (ngn / k) ,
413938 byteCobalah online!
{
}
berfungsi dengan argumenx
#x
panjang darix
- ketinggian matriks2##x
dua salinan - tinggi dan lebar (diasumsikan sama)s:
ditugaskan kepadas
untuk "bentuk"!s
semua indeks matriks dengan bentuks
, misalnya!5 5
adalahIni adalah matriks 2-baris (daftar daftar) dan kolomnya sesuai dengan indeks dalam matriks 5x5.
&/
minimum di atas dua baris:i&|i:
tetapkan kei
, balikkan (|
), dan bawa minima (&
) dengani
Ini adalah nomor cincin rata dari matriks 5x5:
4!1+
tambahkan 1 dan ambil modulo 4 sisanya(+|:)
adalah fungsi yang berputar dengan membalikkan (|
- kita perlu:
memaksanya menjadi monadik) dan kemudian mentransposisi (+
- karena itu bukan kata kerja paling kanan di "kereta", kita tidak perlu a:
)4(+|:)\x
menerapkannya 4 kalix
, menjaga hasil menengah,/'
ratakan masing-masing+
mengubah urutan(
)@'
indeks setiap nilai di sebelah kiri dengan setiap nilai di sebelah kanans#
membentuk kembali kes
sumber
JavaScript (ES6), 99 byte
Cobalah online!
Bagaimana?
sementara yang lain dibiarkan tidak berubah.
Ini sama dengan mengatakan bahwa sel tidak dirotasi jika kita memiliki:
yang merupakan tes yang digunakan dalam kode:
Lalu kami menurunk dan mulai lagi, hingga k = - 1 atau k = - 3 / 2 (tergantung pada paritas W ). Apa pun itu, hal itu memicu kondisi berhenti kami:
sumber
Jelly , 24 byte
Cobalah online!
- Lynn
sumber
ḷ""
terlihat ajaib bagiku ^^ ingin menambahkan penjelasan?ḷ""
ajaib. Hanyaḷ"
dengan tambahan"
... oh, ada sedikit kemungkinan bahwaḷ"
ini juga sesuatu yang saya "ciptakan" yang belum banyak digunakan karena seringkali dapat diganti dengan atom tunggal (tidak dalam kasus ini, seperti input juga bisa berisi0
).Haskell , 108 byte
Cobalah online!
Saya menggunakan transpose Laikoni dan memodifikasinya sedikit, untuk memutar array 90 °:
Penjelasan
r
memutar array sebesar 90 °.(!)
adalah fungsi tingkat yang lebih tinggi: "berlaku untuk pusat".g![1,2,3,4,5]
adalah[1] ++ g[2,3,4] ++ [5]
.f
adalah fungsi tornado: casing dasar adalah ukuran 1 dan 2 (entah bagaimana 0 tidak bekerja).Baris terakhir adalah di mana keajaiban terjadi: kita menerapkan
r.r.r.(f!).r
pada baris tengahx
dan kemudian memutar hasilnya. Mari kita sebut mereka baris tengah M . Kami ingin recurse di tengah kolom dari M , dan untuk mendapatkan mereka, kita bisa memutar M dan penggunaan kemudian(f!)
. Kemudian kita gunakanr.r.r
untuk memutar M kembali ke orientasi aslinya.sumber
Java 10,
198192 byte-6 byte terima kasih kepada @ceilingcat .
Cobalah online.
Penjelasan:
b
pada dasarnya digunakan untuk menunjukkan di mana kita berada. Dan itu akan memutar cincin ini, termasuk semua yang ada di dalamnya satu kali searah jarum jam selama setiap iterasi.Penggantian matriks input dilakukan karena Java adalah pass-by-reference, jadi hanya pengaturan
r=m
akan berarti kedua matriks dimodifikasi ketika menyalin dari sel, menyebabkan hasil yang salah. Karena itu kami harus membuatObject
-matrix baru (referensi baru), dan menyalin nilai di setiap sel satu-per-satu sebagai gantinya.sumber
MATLAB, 93 byte
Saya yakin ini bisa golf lagi entah bagaimana.
Penjelasan
sumber
C (gcc) ,
128118115 byte-15 byte dari @ceilingcat
Cobalah online!
sumber
Haskell, 274 byte
w
adalah fungsi utama, yang memiliki tipe[[a]] -> [[a]]
yang Anda harapkan.Saya yakin pegolf Haskell yang lebih berpengalaman dapat memperbaiki ini.
sumber