Pengantar:
Terinspirasi oleh dua pertanyaan SO ini (tidak diragukan lagi dari kelas yang sama): cetak elemen dalam subarray jumlah maksimum tanpa elemen yang berdekatan java dan jumlah maksimum elemen yang tidak berdekatan dari array, untuk dicetak .
Tantangan:
Diberikan daftar bilangan bulat, menghasilkan urutan yang terdiri dari elemen yang tidak berdekatan yang memiliki jumlah tertinggi. Berikut beberapa contoh:
[1,2,3,-1,-3,2,5]
akan menghasilkan[1,3,5]
(dengan jumlah9
) pada indeks berbasis 0[0,2,6]
.[4,5,4,3]
akan menghasilkan[4,4]
(dengan jumlah8
) pada indeks berbasis 0[0,2]
atau[5,3]
(juga dengan jumlah8
) pada indeks berbasis 0[1,3]
.[5,5,10,100,10,5]
akan menghasilkan[5,100,5]
(dengan jumlah110
) pada indeks berbasis 0[0,3,5]
atau[1,3,5]
.
Yang paling penting tentang contoh-contoh di atas, indeks yang mengandung unsur-unsur setidaknya 2 terpisah satu sama lain. Jika kita melihat contoh [5,5,10,100,10,5]
lebih mendalam: kita memiliki potensi berikut berikut yang mengandung item yang tidak berdekatan; dengan indeks mereka di bawahnya; dengan jumlah mereka di bawah itu:
[[5],[10],[100],[10],[5],[5],[100,5],[10,5],[10,10],[5,5],[5,10],[5,100],[5,5],[5,10],[5,100],[5,10],[5,100,5],[5,100,5],[5,10,5],[5,10,10]] // non-adjacent subsequences
[[5],[ 4],[ 3],[ 2],[1],[0],[ 3,5],[ 2,5],[ 2, 4],[1,5],[1, 4],[1, 3],[0,5],[0, 4],[0, 3],[0, 2],[1, 3,5],[0, 3,5],[0, 2,5],[0, 2, 4]] // at these 0-based indices
[ 5, 10, 100, 10, 5, 5, 105, 15, 20, 10, 15, 105, 10, 15, 105, 15, 110, 110, 20, 25] // with these sums
^ ^ // and these two maximums
Karena jumlah maksimumnya adalah 110
, kami mengeluarkan [5,100,5]
sebagai hasilnya.
Aturan tantangan:
- Anda diizinkan untuk mengeluarkan pasangan nilai kunci dari nilai indeks +. Jadi alih-alih
[5,100,5]
Anda dapat menampilkan[[0,5],[3,100],[5,5]]
atau[[1,5],[3,100],[5,5]]
sebagai hasilnya (atau[[1,5],[4,100],[6,5]]
/[[2,5],[4,100],[6,5]]
ketika pengindeksan berbasis 1 digunakan, bukan berbasis 0).- Jika Anda menggunakan pasangan nilai kunci, mereka juga bisa dalam urutan terbalik atau acak, karena jelas nilai mana yang dimaksudkan karena indeks pasangan.
- Mengeluarkan hanya indeks tanpa nilai tidak diizinkan. Ini harus menampilkan nilai, atau nilai / indeks sebagai pasangan nilai kunci (atau dua daftar terpisah untuk 'kunci' dan 'nilai' dengan ukuran yang sama jika pasangan nilai kunci tidak dimungkinkan dalam bahasa pilihan Anda).
- Anda diizinkan untuk menampilkan semua kemungkinan berikutnya dengan jumlah maksimum, bukan hanya satu.
- Seperti yang Anda lihat dari contoh, daftar input dapat berisi nilai negatif dan duplikat juga. Anda dapat menganggap bilangan bulat input berada dalam kisaran .
- Daftar keluaran tidak boleh kosong dan harus selalu mengandung setidaknya satu elemen (jika daftar hanya akan berisi nilai negatif, daftar yang berisi nilai negatif terendah tunggal akan dihasilkan sebagai hasilnya - lihat dua kasus uji terakhir).
- Jika ada satu kemungkinan output tetapi untuk beberapa indeks berbeda, itu diperbolehkan untuk menghasilkan keduanya meskipun mereka mungkin terlihat duplikat. (yaitu contoh di atas, dapat menampilkan
[[5,100,5],[5,100,5]]
untuk kedua kombinasi indeks yang mungkin).
Kasus uji:
Input: Possible outputs: At 0-based indices: With sum:
[1,2,3,-1,-3,2,5] [1,3,5] [0,2,6] 9
[4,5,4,3] [4,4]/[5,3] [0,2]/[1,3] 8
[5,5,10,100,10,5] [5,100,5] [0,3,5]/[1,3,5] 110
[10] [10] [0] 10
[1,1,1] [1,1] [0,2] 2
[-3,7,4,-2,4] [7,4] [1,4] 11
[1,7,4,-2] [7] [1] 7
[1,2,-3,-4,5,6,-7] [2,6] [1,5] 8
[800,-31,0,0,421,726] [800,726]/[800,0,726] [0,5]/[0,3,5]/[0,2,5] 1526
[-1,7,8,-5,40,40] [8,40] [2,4]/[2,5] 48
[-5,-18,-3,-1,-10] [-1] [3] -1
[0,-3,-41,0,-99,-2,0] [0]/[0,0]/[0,0,0] [0]/[3]/[6]/[0,3]/
[0,6],[3,6]/[0,3,6] 0
sumber
[5,100,5]
dua kali untuk contoh ketiga Anda.powerset
Apakah seperangkat himpunan bagian bukan? tetapi sepertinya Anda mengembalikan satu set berikutnya? [4,5,4,3] akan menghasilkan [4,4] di mana [4,4] jelas bukan set.Jawaban:
Sekam , 11 byte
Cobalah online!
Penjelasan
sumber
Haskell , 60 byte
Cobalah online!
Fungsi helper
%
secara rekursif bercabang untuk memilih apakah menyertakan elemen pertama dan menjatuhkan elemen kedua, atau untuk melewatkan elemen pertama. Dibutuhkan maksimum dari semua hasil, yaitu tupel yang elemen pertamanya adalah jumlah, dan elemen kedua adalah daftar terkait yang diekstraksi untuk output.Untuk menangani aturan bahwa daftar kosong dianulir walaupun memiliki trik terkecil, kita melakukan trik menulis yang lucu
sum r<$r
daripadasum r
. Ini membuat daftar yang unsur-unsurnya semuasum r
dan panjangnya berapar
. Dengan begitu, ketika kami memilih maksimum, kami memprioritaskan daftar apa pun daripada yang kosongr
, tetapi perbandingannya bergantung pada elemen pertama yaitusum r
.sumber
R ,
136125 byteCobalah online!
-6 byte terima kasih kepada digEmAll , yang notabene juga mengalahkan saya .
Mengembalikan urutan terpendek sebagai
list
, memutuskan ikatan pada leksikografis pertama dengan indeks.Brute-force menghasilkan semua urutan indeks, kemudian
Filter
s untuk yang tidak berdekatan, yaitu di manaall(diff(x)>1)
. Kemudian subset[
ke dalaml
menggunakan indeks ini, memilih[[
yang pertama di mana jumlahnya adalah max (which.max
).Saya cukup yakin ini adalah jawaban R pertama yang pernah saya tulis yang menggunakansedih,Filter
!Filter
itu ungolfy, tidak heran aku tidak pernah menggunakannya ...sumber
05AB1E , 14 byte
Disimpan 1 byte berkat Kevin Cruijssen
Cobalah online! atau sebagai Test Suite
Penjelasan
sumber
¤ª
untuk berubahĆ
.Brachylog (v2), 14 byte
Cobalah online!
Pengiriman fungsi; input dari kiri, output dari kanan, seperti biasa. Sangat lambat; daftar lima elemen mungkin adalah maksimum untuk pengujian pada TIO.
Hasil yang kami dapatkan dari awalan tidak salah, tetapi juga tidak menarik; semua hasil yang mungkin dihasilkan melalui mengambil suffix (yang mungkin daftar itu sendiri, tetapi tidak boleh kosong), tetapi "suffix" lebih banyak digunakan di Brachylog daripada "awalan atau suffix", jadi saya memilih versi yang terser (dan kurang efisien tapi tetap benar). Ide dasarnya adalah bahwa untuk setiap elemen yang kita inginkan dalam daftar output, partisi ke dalam daftar yang berdekatan perlu menempatkan elemen dan elemen sebelum ke dalam sublist yang sama (karena elemen adalah kedua).elemen sublist), sehingga dua elemen berturut-turut tidak dapat muncul di hasil. Di sisi lain, cukup jelas bahwa daftar apa pun tanpa dua elemen berturut-turut dapat muncul di hasilnya. Jadi begitu kita memiliki semua daftar calon yang mungkin, kita bisa mengambil jumlah semua dari mereka dan melihat mana yang terbesar.
sumber
Jelly ,
1614 byteCobalah online!
Terima kasih kepada @EriktheOutgolfer karena telah menghemat 2 byte!
sumber
JavaScript (ES6),
138 132 130 129126 byteMenghasilkan pasangan nilai kunci.
Cobalah online!
Langkah 1
Langkah 2
sumber
Haskell,
8180 byteCobalah online!
f
membangun semua urutan yang valid dengan melewatkan elemen berikutnya (f(b:c)
) atau menggunakannya dan melewatkan berikutnya (map(a:)(f c)
) dan mengerjakan sisanya secara rekursif. Untuk hasilnya, buat semua urutan (f
), jatuhkan urutan kosong (yang muncul pertama kali dalam daftartail
:), buat pasangan(<sum>,<subsequence>)
(map((,)=<<sum)
), cari maksimum (pasangan dibandingkan dalam urutan leksikografis) ->maximum
) dan turunkan jumlah (snd
).Sunting: -1 byte berkat @Lynn.
sumber
map(:[])a
adalah byte yang lebih pendek dari(pure<$>a)
^^J , 47 byte
Cobalah online!
-7 byte berkat FrownyFrog
asli
J , 54 byte
Cobalah online!
sumber
T-SQL,
122119118 byteInput adalah variabel tabel.
Kueri ini mengambil semua elemen dari variabel tabel, menggabungkannya dengan semua elemen yang tidak berdekatan dengan nilai posisi yang lebih tinggi dan menampilkan teks yang dihasilkan untuk jumlah tertinggi dari nilai-nilai ini.
Cobalah secara online ungolfed
sumber
Bahasa Wolfram (Mathematica) , 144 byte
Cobalah online!
sumber
Pyth, 19 byte
Coba online di sini , atau verifikasi semua uji sekaligus di sini .
sumber
Gaia , 24 byte
Cobalah online!
Ugh,
E‡
melakukan beberapa hal aneh ... menurut dokumentasi, itu harus melakukan sesuatu seperti "diberikani
daftarX
panjang dan panjangj
indeksY
, kembaliX[i][Y[j]]
", tetapi sebaliknya mengembalikan di[X[i][Y[j]] X[i][Y[-j]]
mana pengindeksan negatif merupakan pelengkap, jadi kita harus lakukanev2%
untuk ekstrak hanya yang kita inginkan.sumber
]]
bukan satu?[[1] [2]]
dicetak[[1]] [2]]]]
yang membuatnya sangat sulit untuk membaca / men-debug output daftar.re.sub(" ?$","]",result)
dalam penerjemah yang seharusnyare.sub(" +$","]",result)
tetapi python saya sangat buruk.R ,
108107 byteCobalah online!
-1 terima kasih kepada @Giuseppe
sumber
Bahasa Wolfram (Mathematica) ,
7063 byteCobalah online!
Pencarian tingkat tinggi
,1
diperlukan agar tidak secara tidak sengaja mengembalikan set yang tidak valid (jika tidak, misalnya input{1,1,1}
akan menghasilkan output dari{{1,1},{1,1},{1,1}}
)sumber
Haskell ,
300168 bytesCobalah online!
-132 byte terima kasih atas semua umpan balik dari @nimi :)
Asli
Tidak disatukan (asli)
sumber
f
:f x=zip[0..length x]x
, sehinggaf
menjadif=zip[0..]
.g
hanyag=map unzip
. Fungsi untuk memfilter dengan dalamj
adalahh.fst
(<- pasangan terbalik!).j=filter(h.fst)
. Yangfoldl1+
darik
adalahsum
dan dengan pembuatan pasangan pointfreek=map((,)=<<sum.snd)
.sortBy(...)
dapat diganti dengansortOn fst
:l=snd.last.sortOn fst
. Akhirnya karena Anda menggunakan semua fungsi hanya sekali, Anda dapat menggariskannya ke dalam ekspresi pointfree tunggal:z=snd.last.sortOn fst.map((,)=<<sum.snd).filter(h.fst).map unzip.subsequences.zip[0..]
Data.Function
lagi.h
: kami sedang mencari elemen yang tidak berdekatan, yaitu perbedaan indeks yang berdekatan harus>1
.zipWith(-)=<<tail
membangun daftar seperti perbedaan, tetapi gagal untuk daftar kosong, jadi kita perlu tambahantail
padasubsequences
untuk menyingkirkan itu. Sebaris lagi. Cobalah online!Arang , 46 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Variabel
u
ditentukan sebelumnya dengan daftar kosong. Ini dimasukkan ke dalam daftar yang ditugaskanh
. Variabel-variabel ini bertindak sebagai akumulator.u
berisi sublists yang menyertakan elemen input terbaruq
sementarah
berisi sublists yang tidak (dan karenanya cocok untuk menambahkan elemen input berikutnya).Lingkarkan elemen-elemen input.
Simpan daftar sublists yang berisi elemen sebelumnya.
Ambil semua sublists yang tidak mengandung elemen sebelumnya, tambahkan elemen saat ini, dan simpan hasilnya sebagai daftar sublists yang berisi elemen saat ini. (Saya tidak menggunakan di
Push
sini karena saya perlu mengkloning daftar.)Gabungkan kedua daftar sebelumnya ke dalam daftar baru daftar yang tidak mengandung elemen saat ini.
Gabungkan subtitel untuk terakhir kalinya dan hapus daftar kosong asli (yang tidak dapat dijumlahkan oleh Arang).
Hitung jumlah dari semua sublists.
Temukan indeks dari jumlah terbesar dan hasilkan sublist yang sesuai.
sumber
Japt
-h
, 22 byteCobalah
sumber
Japt
-h
, 21 bytePernah memiliki salah satu tantangan di mana Anda benar-benar lupa bagaimana bermain golf ?!
Cobalah
sumber
Python 2 ,
637065 byteCobalah online!
5 byte thx ke ArBo
sumber
[1, 7, 4, -2] [1, 4] 5 7
mendapatkan jawaban yang salah.