Dengan diberikan daftar kosong bilangan bulat positif , tugas Anda adalah menentukan jumlah nilai unik ± x ± y ± z ± ...
Sebagai contoh, perhatikan daftarnya . Ada delapan cara yang memungkinkan untuk membuat penjumlahan:
Ada enam jumlah unik , jadi jawabannya adalah 6 .
Uji Kasus
[1, 2] => 4
[1, 2, 2] => 6
[s]*n => n+1
[1, 2, 27] => 8
[1, 2, 3, 4, 5, 6, 7] => 29
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] => 45
[1, 7, 2, 8, 3, 1, 6, 8, 10, 9] => 56
[93, 28, 92, 100, 43, 66, 2, 98, 2, 52, 57, 75, 39, 77, 45, 15, 13, 82, 81, 20, 68, 14, 5, 3, 72, 56, 57, 1, 23, 25, 76, 59, 60, 71, 71, 24, 1, 3, 72, 84, 72, 28, 83, 62, 66, 45, 21, 28, 49, 57, 70, 3, 44, 47, 1, 54, 53, 56, 36, 20, 99, 9, 89, 74, 1, 14, 68, 47, 99, 61, 46, 26, 69, 21, 20, 82, 23, 39, 50, 58, 24, 22, 48, 32, 30, 11, 11, 48, 90, 44, 47, 90, 61, 86, 72, 20, 56, 6, 55, 59] => 4728
Solusi referensi (mengoptimalkan kecepatan dan bukan ukuran).
Jika Anda tidak dapat menangani kasus terakhir karena Anda menggunakan metode brute-force atau yang serupa, itu tidak masalah.
Mencetak gol
Ini adalah kode-golf , sehingga solusi terpendek yang valid (diukur dalam byte) menang.
code-golf
math
combinatorics
Buah Esolanging
sumber
sumber
[2,2,2,2,...]
. Jawabannya harus panjang array + 1. Ini karena dalam hal ini posisi tanda tidak relevan dan hanya jumlah setiap masalahJawaban:
Bahasa Wolfram (Mathematica) , 27 byte
Cobalah online!
Menemukan jumlah jumlah sign-swapping yang unik sama dengan menemukan jumlah jumlah subset unik.
Suatu bukti akan melibatkan penambahan jumlah input ke masing-masing jumlah sign-swapping dan membaginya menjadi dua. Lalu, ada sebuah bujukan yang jelas.
Penjelasan
Iterasi melalui input, dengan nilai awal adalah
{0}
: bawa penyatuan antara<current value>
dan<current value> + input element
(peta ke daftar).Versi Golfy dari
Length
fungsi.sumber
Jelly , 6 byte
Cobalah online!
Latar Belakang
Biarkan L menjadi daftar input dan {P, N} partisi ke dalam puncak aljabar dengan tanda-tanda positif dan negatif. Spec tantangan memerlukan penghitungan s {P, N} = jumlah (P) - jumlah (N) .
Namun, karena jumlah (P) + jumlah (N) = jumlah (L) dan jumlah (L) tidak bergantung pada partisi, kita memiliki s {P, N} = jumlah (P) - jumlah (N) = jumlah ( P) - (jumlah (L) - jumlah (P)) = 2sum (P) - jumlah (L) .
Dengan demikian, setiap nilai unik dari jumlah (P) sesuai dengan satu nilai unik s {P, N} .
Bagaimana itu bekerja
sumber
MATL ,
1110 byteCobalah online! Ini adalah port jawaban Oktaf / MATLAB Luis Mendo . Saya masih mencoba untuk belajar MATL, dan saya pikir saya akan mempostingnya, bersama dengan penjelasan, karena MATL adalah bahasa bulan ini.
Penjelasan:
Berikut adalah read-through untuk siapa pun yang tidak terbiasa dengan pemrograman berbasis stack pada umumnya, dan MATL pada khususnya.
Vektor input secara implisit ditempatkan pada stack. Perhatikan bahwa ketika operasi dilakukan pada elemen dalam tumpukan, maka elemen itu dihapus dari tumpukan.
Dan kemudian menampilkan elemen terakhir pada stack secara implisit.
sumber
Python 2 , 55 byte
Cobalah online!
sumber
Python 2 , 52 byte
Cobalah online!
Menggunakan representasi biner dari angka untuk menyimpan jumlah subset yang dapat dijangkau.
sumber
k<<n
menambahkan n ke setiap jumlah. Oring dengank
menyimpan jumlah baru inik
sementara menyimpan semua yang sebelumnya, dan05AB1E , 4 byte
Memanfaatkan pendekatan yang sama yang digunakan dalam jawaban Dennis 'Jelly .
Cobalah online!
sumber
Haskell, 46 byte
Cobalah online!
Alih-alih menjumlahkan himpunan bagian dari daftar input, kami membuat semua kombinasi baik menyimpan nomor atau menggantinya dengan
0
, misalnyaIni dua byte lebih pendek dari
subsequences
.sumber
f x=sum[1|i<-[0..sum x],elem i$sum<$>mapM(:[0])x]
akan lebih pendek dari impor, tetapi ternyata tidak.import Data.List;length.foldr((<*>)union.map.(+))[0]
R,
8375 byte-8 byte berkat JayCe dan Giuseppe
Membuat matriks dari semua kemungkinan kombinasi (1, -1) untuk ukuran vektor input, gandakan dengan vektor asli untuk mendapatkan jumlah. Kemudian unik dan temukan panjang hasilnya.
function(v)nrow(unique(t(t(expand.grid(rep(list(c(1,-1)),sum(v|1)))))%*%v))
versi sebelumnya:
f=function(v)nrow(unique(as.matrix(expand.grid(rep(list(c(1,-1)),length(v))))%*%v))
Tidak dikoleksi dengan komentar:
sumber
t
: TIOsum(v|1)
byte lebih pendek darilength(v)
Oktaf / MATLAB,
454140 byteInput adalah vektor kolom (menggunakan
;
sebagai pemisah).Kode kesalahan untuk kasus uji terakhir karena pembatasan memori.
Ini menggunakan ide dari jawaban JungHwan Min (himpunan bagian alih-alih tanda bolak-balik) untuk menyimpan beberapa byte.
Cobalah online!
sumber
Pari / GP , 39 byte
Cobalah online!
sumber
Python 3 , 61 byte
Cobalah online!
Pendekatan rekursif, melacak jumlah subset unik.
Asyiknya adalah ini berdetak
itertools
dengan margin besar:76 byte
Cobalah online!
sumber
Pyth , 5 byte
Memanfaatkan pendekatan yang sama yang digunakan dalam jawaban Dennis 'Jelly .
Coba di sini.
sumber
Attache , 29 byte
Cobalah online!
Ini berfungsi dengan melipat
±
operator di atas daftar input, lalu mengambil±
daftar itu, lalu menghitung atom unik array.Berikut beberapa contoh cara kerja lipat:
Lalu kami menghasilkan semua permutasi dari tanda akhir dengan menerapkan PlusMinus sekali lagi.
Versi yang lebih efisien, 31 byte
Cobalah online! Ini tidak habis waktu pada kasus uji akhir, karena tidak menghasilkan kombinasi yang tidak perlu.
sumber
R , 62 byte
Cobalah online!
Algoritma Ports Dennis. Ini paling dekat dengan jawaban Octave / MATL karena menggunakan produk bitmap dan matriks yang sama untuk inklusi / pengecualian istilah.
sumber
APL (Dyalog Classic) ,
1211 byte-1 terima kasih kepada H.PWiz
Cobalah online!
sumber
-⍨
bisa⊢
Perl 5
-p
, 39 byteCobalah online!
sumber
JavaScript (ES6), 63 byte
Cobalah online!
sumber
Sekam , 5 byte
Cobalah online!
Port of Dennis 'Jelly menjawab.
Penjelasan
sumber
Perl 6 , 33 byte
Cobalah online!
sumber
Utilitas Bash + GNU, 49 byte
Cobalah online!
Input diberikan sebagai daftar yang dipisahkan koma pada baris perintah.
Penjelasan
sumber
bahasa mesin x86_64 untuk Linux,
3129 byteCobalah online!
Terinspirasi oleh jawaban xnor. Membutuhkan mesin dengan
POPCNT
instruksi.sumber
C (gcc) ,
7469 byteCobalah online!
Port C dari jawaban xnor
sumber
APL (Dyalog Classic) ,
343332 byteCobalah online!
Terima kasih kepada @ngn untuk -1 byte!
sumber
1-⍨≢⍵
->≢1↓⍵
+.×⍨
->+.×
Bersihkan , 82 byte
Cobalah online!
Menentukan fungsi yang
? :: [Int] -> Int
digunakanf :: [Int] -> ([Int] -> Int)
sebagai penolong untuk mengurangi setiap jumlah yang mungkin setelah penambahan atau pengurangan.sumber
APL (Dyalog Classic) , 21 byte
Cobalah online!
Penjelasan
Fungsi kereta setara dengan
{((⍴⍵)⍴2)⊤⍳(⍴⍵)}
, yang menghasilkan matriks yang memiliki representasi biner dari 0 hingga panjang input sebagai kolomPeta
1
s ke-1
s dan0
s ke1
sPerkalian matriks dengan input, yang memberikan array dari semua jumlah yang mungkin
Hapus duplikat, lalu hitung
sumber
Java 8,
2078344 bytePort of @ xnor's Python 2 menjawab .
-39 byte terima kasih kepada @Jakob .
Cobalah online .
sumber
Long
:s->Long.bitCount(s.reduce(1l,(a,e)->a|a<<e))
..reduce
(dan.bitCount
juga saya bisa menambahkan ..>.>) -39 byte di sana! :)Java 8, 85 byte
Port Java lain dari jawaban xnor . Seperti jawaban asli, ini menggunakan bitmap presisi sembarang sehingga tidak ada batas atas pada ukuran jumlah subset.
Ini lambda dari sekuensial
java.util.stream.Stream<Integer>
keint
.Cobalah secara Online
Perhatikan bahwa penggabung (argumen ketiga ke
reduce
) tidak digunakan karena aliran berurutan. Fungsi yang saya pilih adalah arbitrer.sumber
Julia 0,6 ,
5452 byteCobalah online!
( -2 byte dengan mengganti
¬
dengan~
, terima kasih kepada Jo King )Berfungsi untuk semua kasus uji. Manfaatkan siaran untuk mengumpulkan semua jumlah yang mungkin, lalu hitung.
Penjelasan:
Solusi yang lebih lama:
Julia 0,6 , 64 byte
Cobalah online!
Bekerja untuk array input dengan panjang hingga 63 (jadi tidak bekerja untuk kasus uji terakhir, yang baik-baik saja menurut OP).
Penjelasan:
sumber
JavaScript (Babel Node) , 64 byte
Cobalah online!
Ini tidak akan berfungsi untuk testcase terakhir.
Solusi yang lebih efektif (bekerja pada testcase terakhir):
JavaScript (Babel Node) , 71 byte
Cobalah online!
Ini tidak akan berfungsi di browser yang sebenarnya karena
Array#smoosh
.Terima kasih kepada Bubbler,
[x+f,x-f]
->[x+f,x]
menghemat 2 byte.sumber
[x+f,x]
sebagai pengganti[x+f,x-f]
( bukti oleh JungHwan Min ).F=([f,...r],s=[0])=>f?F(r,[...s,...s.map(x=>x+f)]):new Set(s).size
[...s,...s.map(x=>x+f)]
,,s.concat(s.map(x=>x+f))
dan,s,s.map(x=>s.push(x+f))
berbagi panjang yang sama ...Merah , 73 byte
Port of Dennis 'Python 2 menjawab. Tidak menangani test case terakhir.
Cobalah online!
sumber