Jumlah Matriks yang tidak tumpang tindih
Diberikan k array panjang n , hasilkan jumlah maksimum yang mungkin dengan menggunakan satu elemen dari setiap array sehingga tidak ada dua elemen dari indeks yang sama. Dijamin bahwa k <= n.
Memasukkan
Daftar nonempty array nonempty dari integer.
Keluaran
Integer yang mewakili jumlah maksimum.
Contohnya
Input -> Output
[[1]] -> 1
[[1, 3], [1, 3]] -> 4
[[1, 4, 2], [5, 6, 1]] -> 9
[[-2, -21],[18, 2]] -> 0
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 15
[[1, 2, 3, 4], [5, 4, 3, 2], [6, 2, 7, 1]] -> 16
[[-2, -1], [-1, -2]] -> -2
code-golf
array-manipulation
Quintec
sumber
sumber
Jawaban:
Jelly ,
106 byteCobalah online!
(4 byte disimpan oleh @ Dennis, yang menunjukkan bahwa Jelly memiliki built-in "jumlah main diagonal". Saya tidak mengharapkan itu memiliki salah satu dari itu; solusi sebelumnya mengimplementasikan operasi tanpa menggunakan builtin. Operasi yang dimaksud,
Æṭ
, didefinisikan sebagai "jejak", tetapi jejak tersebut hanya didefinisikan untuk matriks persegi; Jelly juga menerapkan generalisasi untuk matriks persegi panjang.)Peningkatan atas jawaban lain sebagian besar dari algoritma yang lebih sederhana (sehingga terser untuk mengekspresikan); program ini awalnya ditulis dalam Brachylog v2 (
{\p\iᶠ∋₎ᵐ+}ᶠot
), tetapi Jelly memiliki beberapa builtin untuk bagian-bagian dari program yang harus dijabarkan dalam Brachylog, jadi ini lebih pendek.Penjelasan
Seharusnya jelas bahwa untuk setiap solusi masalah, kita dapat mengubah kolom kolom dari matriks asli untuk menempatkan solusi tersebut ke diagonal utama. Jadi solusi ini hanya membalikkan itu, menemukan semua kemungkinan diagonal permutasi utama.
Perhatikan bahwa operasi "permute the kolom" dilakukan sebagai "transpose, permute the rows" tanpa repot-repot untuk mentranspos kembali; sisa dari algoritma kebetulan simetris tentang diagonal utama, jadi kita tidak perlu membatalkan transpos dan dengan demikian dapat menghemat satu byte.
sumber
ZŒ!ÆṭṀ
menghemat empat byte. Cobalah online!ZŒ!ŒD§ṀḢ
sebelum mengingatÆṭ
itu sesuatu.J , 28 byte
Cobalah online!
Di sini panggilan rekursif dilakukan dengan
$:
yang mewakili fungsi anonim terbesar yang mengandungnya. Kita beruntung di J untuk memiliki primitifx u\. y
, yang berlakuu
untuk "perbaikan" berturut-turut yangy
diperoleh dengan menekan infiks berturut-turut dari panjangx
item dalamy
; di sini kami ingin mengesampingkan kolom berturut-turut untuk mendapatkan "anak di bawah umur", jadi kami mentransposisikan|:
baris bawah (atau ekor}.
) dariy
, dan kemudian mengulangi pada transpos outfix mereka.sumber
Python 3 ,
94 90 89 8480 byte-4 byte terima kasih kepada xnor (menggunakan set alih-alih daftar)!
Cobalah online!
sumber
y
satu set untuk mempersingkat cek keanggotaan:f=lambda x,y={-1}:x>[]and max(e+f(x[1:],y|{i})for(i,e)in enumerate(x[0])if{i}-y)
.-1
Trik itu benar-benar pintar :) Terima kasih banyak!Sekam ,
12 119 byteCobalah online!
Terima kasih kepada BMO untuk menyarankan port jawaban ais523 dan penyimpanan 2-byte, yang berhasil saya tingkatkan lebih lanjut, dan pada gilirannya BMO mengurangi 2 byte lagi.
Solusi sebelumnya (14 byte)
Cobalah online!
Saya tidak dapat membuat rangkaian uji karena jawaban ini menggunakan perintah argumen baris perintah pertama secara eksplisit. Tapi Husk tidak menggunakan STDIN sama sekali jadi saya memasukkan semua test case di sana, jadi Anda bisa menyalin paste di bidang argumen untuk memeriksanya. Perhatikan juga bahwa array dalam Husk mungkin tidak mengandung spasi antar elemen saat sedang diinput.
Bagaimana itu bekerja?
Rincian kode
Contoh
Satu harus memilih tepat satu indeks dari masing-masing sehingga tidak ada dua indeks yang sesuai. Jadi, kami menghasilkan rentang panjang baris dan hanya menyimpannya tanpa duplikat, menghasilkan kombinasi berikut (setiap kombinasi adalah kolom, bukan baris untuk menghemat ruang):
Kemudian, program mengindeks dalam daftar input dengan masing-masing elemen kombinasi, menghasilkan:
sumber
JavaScript (ES6),
7471 byteTerima kasih kepada @tsh untuk mengidentifikasi 2 byte tidak berguna yang digunakan untuk memperbaiki bug.
Disimpan 3 byte berkat @tsh
Cobalah online!
sumber
0
dari berbagai masukan,-1+(-1)
adalah-2
dan itu adalah jawaban yang benar.f=([a,...r],k,i=1)=>a?Math.max(...a.map(c=>k&(i+=i)?-1/0:c+f(r,k|i))):0
Ini aneh, tetapiMath.max
menghemat byte ...Jelly ,
1312 byteCobalah online!
Versi alternatif, 11 byte
Ini menggunakan
œ!
built-in yang baru ditambahkan , yang menghasilkan semua permutasi dengan panjang tertentu.Cobalah online!
Bagaimana itu bekerja
sumber
XLṗL
bukanJ€Œp
.Haskell , 65 byte
Cobalah online!
Penjelasan & Tidak Disatukan
Fungsi
take i<>drop(i+1)
mengambil daftar dan menghilangkan elemen pada posisii
.Fungsi ini
f
membuat setiap elemen yang mungkin adae
pada posisii
, menghilangkan elemen pada posisii
dari elemen yang tersisa dan menambahe
optimal yang dihitung secara rekursif:Dan kasus dasar untuk daftar kosong adalah
0
:sumber
Brachylog , 18 byte
Cobalah online!
Penjelasan
sumber
Perl 6 ,
5049 byteCobalah online!
Cukup pendek, meskipun ada
permutations
panggilan panjang . Ini adalah blok kode anonim yang mengambil daftar daftar dan mengembalikan nomor.Penjelasan:
sumber
K (oK) ,
40, 32, 28,19 byte-13 byte terima kasih kepada ngn!
Cobalah online!
Solusi awal:
Cobalah online!
Catatan: Tidak berfungsi untuk test case pertama [[1]]
Penjelasan:
{ }
- berfungsi dengan argumenx
sumber
prm
dapat diterapkan langsung ke daftar untuk menghasilkan permutasi=
, tetapi hasilnya lebih lama. Apakah adaflatten
di OK?flatten
dalam arti apa?(1 2 3; 4 5 6; 7 8 9) -> (1 2 3 4 5 6 7 8 9)
,/
atau jika Anda ingin masuk ke struktur yang lebih dalam:,//
Haskell , 65 byte
Cobalah online!
71 byte
Cobalah online!
The
[x|x<-a,y<-a,x==y]==a
cek bahwa unsur-unsura
yang berbeda. Ini menggunakan sejumlah karakter yang mengejutkan, tetapi saya tidak melihat cara yang lebih pendek.sumber
Pyth,
1512 byteCobalah online di sini .
Sunting: disimpan 3 byte, milik issacg
sumber
.PUlhQl
dapat digantikan oleh.plh
.V
secara implisit mengabaikan entri tambahan.05AB1E ,
1813 byteSaya merasa terlalu panjang, tapi saya tidak yakin bagaimana melakukan pengindeksan byte-efisien dalam 05AB1E ..Dan saya memang benar bahwa itu terlalu panjang .. -5 byte terima kasih kepada @Emigna .Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Contoh dijalankan:
[[1,4,2],[5,6,1]]
нgL
):[1,2,3]
œ
):[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
ε‚
):[[[[1,4,2],[5,6,1]],[1,2,3]],[[[1,4,2],[5,6,1]],[1,3,2]],[[[1,4,2],[5,6,1]],[2,1,3]],[[[1,4,2],[5,6,1]],[2,3,1]],[[[1,4,2],[5,6,1]],[3,1,2]],[[[1,4,2],[5,6,1]],[3,2,1]]]
ø
):[[[[1,4,2],1],[[5,6,1],2]],[[[1,4,2],1],[[5,6,1],3]],[[[1,4,2],2],[[5,6,1],1]],[[[1,4,2],2],[[5,6,1],3]],[[[1,4,2],3],[[5,6,1],1]],[[[1,4,2],3],[[5,6,1],2]]]
ε`è]
):[[4,1],[4,5],[2,6],[2,5],[1,6],[1,1]]
(CATATAN: 05AB1E diindeks 0 (dengan pembungkus otomatis), jadi pengindeksan3
menjadi[5,6,1]
hasilnya5
.)O
):[5,9,8,7,7,2]
à
):9
sumber
нgLœε‚øε
è] OZ` untuk 13 .Haskell, 84 byte
Cobalah online!
sumber
Ruby ,
747269 byteCobalah online!
sumber
05AB1E , 7 byte
Port dari Jelly CW @ ais523 menjawab , jadi pastikan Anda juga menambahkannya!
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber