Membiarkan A
menjadi m
oleh n
persegi panjang bilangan bulat positif , di mana m
dan n
juga bilangan bulat positif .
Kami tertarik pada jalur RoD ('Kanan-atau-Bawah') dari sel kiri atas A
ke sel kanan bawah; dalam jalur RoD, setiap sel yang berurutan dari jalur tersebut adalah satu sel di sebelah kanan atau satu sel di bawah dari sel sebelumnya.
Dengan adanya jalur RoD semacam itu, kita dapat mengambil jumlah sel di A
dalam jalur itu.
Sebagai contoh, perhatikan matriks 4 oleh 3:
[ [1, 2, 3, 4],
[5, 1, 6, 7],
[8, 2, 1, 1] ]
Maka kita dapat mempertimbangkan jalur RoD:
1 > 2 3 4
v
5 1 6 7
v
8 2 > 1 > 1
yang memiliki jumlah 1+2+1+2+1+1=8
. Perlu dicatat bahwa jalur ini memiliki jumlah terkecil dari semua jalur RoD yang mungkin dari kiri atas ke kanan bawah dalam matriks itu.
Jadi, tantangan yang diusulkan adalah untuk menyediakan fungsi / program terpendek dalam bahasa pilihan Anda yang menghasilkan jumlah minimum jalur RoD dari kiri atas ke kanan bawah dalam matriks yang diberikan A
.
Celah terlarang yang biasa berlaku. Masukan Anda dapat dalam format apa pun yang wajar; output Anda harus berupa bilangan bulat.
Ini adalah kode-golf; jawaban dinilai berdasarkan jumlah byte.
Uji Kasus
[ [5] ] -> 5
[ [5, 2] ] -> 7
[ [5],
[2] ] -> 7
[ [ 9 , 1 , 12, 3 ],
[ 12, 11, 6 , 11],
[ 12, 9 , 2 , 11] ] -> 40
[ [ 6 , 8 , 11, 2 ],
[ 3 , 6 , 7 , 6 ],
[ 6 , 2 , 8 , 12] ] -> 37
[ [ 4 , 5 , 8 , 4 ],
[ 6 , 5 , 9 , 4 ],
[ 2 , 5 , 6 , 8 ] ] -> 31
[ [ 4 , 5 , 15, 18, 30],
[ 26, 26, 3 , 4 , 5 ],
[ 7 , 9 , 29, 25, 14],
[ 16, 1 , 27, 13, 27],
[ 23, 11, 25, 24, 12],
[ 17, 23, 7 , 14, 5 ] ] -> 94
[ [ 10, 15, 7 , 2 , 9 ],
[ 24, 5 , 2 , 1 , 25],
[ 2 , 12, 14, 30, 18],
[ 28, 4 , 12, 22, 14],
[ 15, 21, 21, 11, 4 ],
[ 21, 15, 21, 29, 9 ] ] -> 103
sumber
JavaScript (ES6),
787776 byteCobalah online!
Berkomentar
sumber
Haskell,
6357 byteCobalah online!
sumber
MATL ,
38363029 byteTerima kasih kepada @Giuseppe karena menunjukkan kesalahan, sekarang diperbaiki.
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
R , 90 byte
Cobalah online!
Solusi naif: beralih melalui array (turun kolom), mengganti setiap entri dengan jumlah itu sendiri dan minimum tetangga di atas dan ke-kiri, jika ada, lalu kembalikan entri terakhir.
sumber
Perl 6 ,
5754 byteCobalah online!
Penjelasan
sumber
$!
bukannya&f
Röda ,
10089 byteCobalah online!
-9 byte berkat Sapi dukun
sumber
Python 3 , 108 byte
Cobalah online!
Tidak disatukan
sumber
Jelly , 21 byte
Cobalah online!
Bagaimana?
sumber
APL (Dyalog Classic) ,
3732 byteCobalah online!
+⍀+\
jumlah parsial secara horizontal dan vertikal - ini memberikan perkiraan awal yang terlalu tinggi untuk jalur ke setiap kotak9e9(
...)⍣≡
terapkan "..." hingga konvergensi, pada setiap langkah melewati sejumlah sangat besar (9 × 10 9 ) sebagai argumen kiri,
tambahkan9e9
-s di sebelah kiri dari perkiraan saat ini2⊣/
ambil yang pertama dari setiap pasangan sel yang berurutan, secara efektif menjatuhkan kolom terakhir2⊣⌿⍪
hal yang sama secara vertikal - taruh9e9
di atas dan letakkan baris terakhir(2⊣⌿⍪) ⌊ 2⊣/,
minimal⍵+
tambahkan matriks asli⊢⌊
coba tingkatkan perkiraan saat ini dengan itu⊃⌽,
sel kanan bawahsumber
Arang , 46 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Ini mungkin akan lebih pendek jika ada tiga argumen
reduce
di Charcoal.Isi ulang array yang berfungsi dengan nilai besar kecuali yang pertama yang nol.
Loop di atas baris input.
Inisialisasi total saat ini dengan elemen pertama dari array yang berfungsi.
Loop di atas kolom input.
Ambil minimum dari total saat ini dan elemen saat ini dari array yang berfungsi dan tambahkan elemen saat ini dari input untuk memberikan total arus yang baru.
Dan simpan itu kembali dalam array yang berfungsi siap untuk baris berikutnya.
Cetak total setelah input selesai diproses.
sumber
Jelly , 17 byte
Cobalah online!
sumber
Java 8,
197193 byte-4 byte terima kasih @ceilingcat .
Cobalah online.
Penjelasan umum:
Saya sebenarnya sudah melakukan tantangan ini sekitar setahun yang lalu dengan Project Euler # 81 , kecuali itu terbatas pada matriks persegi daripada
N
olehM
matriks. Jadi saya sedikit mengubah kode saya dari dulu ke akun untuk itu.Saya pertama-tama menjumlahkan baris paling bawah dan kolom paling kanan dari sel paling belakang. Jadi mari kita gunakan contoh matriks tantangan:
Sel terakhir tetap sama. Sel terakhir kedua baris bawah menjadi jumlah yang:
1+1 = 2
, dan sama untuk sel terakhir kedua kolom paling kanan:1+7 = 8
. Kami terus melakukan ini, jadi sekarang matriksnya terlihat seperti ini:Setelah melakukan itu, kita melihat semua baris yang tersisa satu per satu dari bawah ke atas dan kanan ke kiri (kecuali untuk kolom / baris terakhir), dan kita mencari setiap sel di kedua sel di bawahnya dan di sebelah kanan untuk melihat mana yang lebih kecil.
Jadi sel yang mengandung angka itu
6
menjadi8
, karena di2
bawahnya lebih kecil dari8
kanannya. Kemudian kita melihat yang1
berikutnya (ke kiri), dan melakukan hal yang sama. Itu1
menjadi5
, karena di4
bawahnya lebih kecil dari8
kanannya.Jadi setelah kita selesai dengan baris kedua hingga terakhir, matriksnya terlihat seperti ini:
Dan kami terus melakukan ini untuk seluruh matriks:
Sekarang sel pertama akan berisi hasil kami, yaitu
8
dalam hal ini.Penjelasan kode:
sumber
Brachylog ,
2625 byteCobalah online!
-1 byte karena potongan tidak diperlukan - Anda tidak dapat mengambil kepala dari daftar kosong
Mungkin ada banyak ruang untuk bermain golf ini, tetapi saya perlu tidur.
Pendekatan bermuara pada mencoba setiap nilai untuk output, terkecil pertama, (
∧≜.
) sampai jalan dapat ditemukan (b|bᵐ
) ke sudut kanan bawah (~g~g
) yang menghasilkan jumlah itu (hhX&...↰+↙X
).sumber
Java (JDK) , 223 byte
Mengambil input sebagai Daftar 2D int.
Tambahan 19 byte untuk
import java.util.*;
disertakan.Cobalah online!
Bagaimana itu bekerja
sumber
Python 2 , 86 byte
Cobalah online!
Jika
B
merupakan transpose dariA
, maka definisi masalah menyiratkan ituf(A)==f(B)
.A[1:]
adalah array yangA
hilang baris atasnya.zip(*A[1:])
adalah array yangA
hilang kolom paling kiri dan dipindahkan.sum(sum(A,()))
adalah jumlah semua elemen dalamA
.Jika
A
hanya memiliki satu kolom atau satu baris, hanya ada satu jalur, jadif
kembalikan jumlah semua elemen diA
; kalau tidak kita recurse dan kembali penjumlahan dariA[0][0]
+ yang lebih kecil darif
dariA
hilang baris atas danf
dariA
hilang kolom paling kiri.sumber