Dengan matriks, jumlah nilainya naik / turun atau kiri / kanan untuk membentuk X, lipat ke atas, dan kembalikan daftar. Saya jelaskan algoritme di sini:
Algoritma
Input Anda akan berupa matriks persegi bilangan bulat berukuran ganjil dalam kapasitas numerik wajar bahasa Anda.
Mari kita ambil matriks berikut sebagai contoh:
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
Pertama, tambahkan setiap angka ke nomor terdekat yang ada di diagonal utama atau antidiagonal. Yaitu, bagi matriks menjadi empat bagian di sepanjang diagonal utama dan antidiagonal, dan kemudian jumlah semua angka di setiap bagian menuju pusat, seperti:
1 2 3 2 1
↓ ↓ ↓
0 → 3 2 3 ← 0
↓
4 → 2 → 5 ← 6 ← 3
↑
7 → 4 7 9 ← 4
↑ ↑ ↑
0 6 7 2 5
Langkah ini memberikan hasil sebagai berikut:
1 1
5 5
39
17 15
0 5
Kemudian, kita lipat dengan meratakan X dan menjalin elemen dengan kiri atas terlebih dahulu dan kiri bawah terakhir. Ini memberikan hasil sebagai berikut:
1, 0, 5, 17, 39, 5, 15, 1, 5
Anda dapat membayangkan ini sebagai peregangan diagonal utama dan memutarnya berlawanan arah jarum jam.
Ini adalah hasil akhir.
Tantangan
Terapkan algoritma ini. Celah standar berlaku. Semua format I / O yang masuk akal dapat diterima.
Uji Kasus
Input
Output
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
1, 0, 5, 17, 39, 5, 15, 1, 5
1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0
1, 6, 11, 16, 47, 7, 22, 5, 0
1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9
1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9
Jawaban:
JavaScript, 113 byte
Tampilkan cuplikan kode
sumber
~~
? Mereka menetralisir satu sama lain, sehingga tidak perlu bagi mereka.~~undefined==0
, jadi ini lebih golf dari(a[q]||0)
.undefined
. Ketika saya menyalin kasus uji TSH digunakan, saya melihat itu bekerja tanpa~~
. Dan karena~~x
sama-sama-(-x)
menetralkan satu sama lain, saya pikir itu entah bagaimana sengaja diletakkan di sana. Terima kasih atas koreksinya.Jelly ,
252321 byteCobalah online!
Versi alternatif, 19 byte
Ini tidak digunakan untuk bekerja karena
Ġ
berperilaku tidak tepat untuk array bersarang. Satu-satunya perbedaan adalah bahwa pasangan [q, p] disebutkan dalam Cara kerjanya diurutkan secara leksikografis alih-alih memetakannya ke p + nq sebelum menyortir.Cobalah online!
Latar Belakang
Kita mulai dengan mengganti elemen-elemennya dengan koordinat, meningkat ke kiri dan ke bawah dan menempatkan (0, 0) di tengah-tengah matriks.
Untuk matriks 7x7 M , kita mendapatkan koordinat berikut.
Kami sekarang menghitung nilai absolut minimum dari setiap pasangan koordinat dan mengalikan tanda-tanda dari kedua koordinat tersebut, memetakan (i, j) ke (tanda (i) m, tanda (j) m) , di mana m = min (| i | , | j |) .
Elemen matriks yang sesuai dengan pasangan yang sama harus dijumlahkan. Untuk menentukan urutan jumlah, kami memetakan setiap pasangan (p, q) untuk p + nq , di mana n adalah jumlah baris / kolom M .
Urutan jumlah sesuai dengan urutan bilangan bulat sesuai dengan puncaknya.
Bagaimana itu bekerja
sumber
Python,
159158 byteCobalah online!
sumber
y+1+(y>l-2)
bisa(y>l-2)-~y
.Dyalog APL ,
10199646259 byte3 byte disimpan oleh @ Adám
Cobalah online!
Menggunakan algoritma hebat Dennis .
sumber
APL (Dyalog) , 60 byte *
Bekerja sama dengan rekan saya Marshall .
Lambda awalan anonim. Membawa matriks sebagai argumen dan mengembalikan vektor. Asumsikan
⎕IO
( I ndex O rigin) menjadi nol, yang merupakan standar pada banyak sistem.Cobalah online!
{
...}
lambda anonim;⍵
adalah argumen yang benar (sebagai huruf paling kanan dari alfabet Yunani):⍴⍵
bentuk argumen (daftar dua elemen identik)r←
simpan sebagair
(seperti dalam r ho)⍳
semua ɩ keterangan dari array sebesar itu, yaitu(0 0)
,(0 1)
…i←
simpan dii
(seperti dalam i ota)=/¨
Boolean di mana koordinatnya sama (yaitu diagonal)(
...)
terapkan fungsi awalan tersembunyi anonim ini:⌽
membalikkan argumen⊢∨
ATAU itu dengan argumen yang tidak dimodifikasi,
ravel (luruskan menjadi daftar sederhana)Kami sekarang memiliki topeng Boolean untuk diagonal.
(
...)/⍨
gunakan itu untuk menyaring yang berikut ini:⊢⍵
hasilkan (untuk memisahkan darir
) argumen{
…}⌺r
Panggil lambda infix anonim berikut pada setiap elemen, denganr
-neighbourhood (diisi dengan nol sesuai kebutuhan) sebagai argumen yang benar (⍵
), dan daftar dua elemen dari jumlah baris berlapis, kolom (negatif untuk bawah / kanan, nol untuk tidak ada) sebagai argumen kiri (⍺
):r÷2
bagir
dengan dua⊃
pilih elemen pertama (mereka identik)⌊
lantai itus←
simpan sebagais
(untuk s hape)i∊⍨¨
untuk setiap elemeni
, Boolean jikas
merupakan anggotanya⍵×
kalikan lingkungan dengan itu(
...)↓
jatuhkan jumlah baris dan kolom berikut (negatif untuk bawah / kanan):×⍺
signum dari argumen kiri (yaitu arah paddings)-
meniadakans×
berkembang biaks
dengan itu,
ravel (luruskan ke daftar)+/
jumlah (plus reduksi)Sekarang kita memiliki matriks total penjumlahan, tetapi kita perlu memfilter semua nilai yang dibaca secara kolom.
⍉
mengubah urutan,
ravel (luruskan menjadi daftar sederhana)* Dengan menghitung
⌺
sebagai⎕U233A
. Cobalah online!sumber