Itu adalah malam musim panas yang hangat ...
ketika mobil bodoh saya memutuskan untuk mogok di tengah jalan dalam perjalanan kembali dari supermarket. Saya mendorongnya ke sampingan dan memutuskan untuk berjalan pulang. Saya membuka bagasi untuk mengambil barang belanjaan dan barang-barang yang tersisa. Saat itulah saya perhatikan barang-barang tidak dikantongi secara merata. Beberapa tas memiliki barang yang lebih berat sementara yang lain memiliki beberapa barang yang lebih ringan - beberapa bahkan memiliki campuran barang-barang tersebut. Agar mudah saya bawa, saya memutuskan untuk mengelompokkan semuanya menjadi dua tas dan membuat bobot mereka sedekat mungkin satu sama lain.
Tujuan Anda
adalah untuk membantu saya mengatur kembali barang-barang menjadi dua tas belanja sedemikian rupa sehingga perbedaan antara kedua tas mendekati nol mungkin.
Secara matematis:
TINGGI KIRI TANGAN - TANGAN KANAN TINGGI. 0
Contoh
Jika saya hanya punya 2 item, Roti dan selai kacang, dan berat roti 250 gram dan selai kacang 150 gram, cara terbaik adalah membawanya secara terpisah dengan dua tangan.
W LH - W RH = W (BREAD) - W (P.BUTTER)
250 - 150 = 100
Kemungkinan lainnya adalah:
W (BREAD, P.BUTTER) - W (tangan kosong) = (250 + 150) - 0 = 400
Ini tidak lebih baik dari kasus pertama kami, jadi Anda harus memilih yang pertama.
Kode Anda harus
- mengambil input angka yang menunjukkan bobot item dalam tas belanja. Unit tidak penting, tetapi harus sama (idealnya kilogram atau gram). Input dapat dilakukan satu per satu atau sekaligus. Anda dapat membatasi jumlah total hingga 20 item, jika Anda mau.
- Format / tipe input terserah Anda untuk memilih, tetapi tidak ada yang lain yang harus ada selain bobot.
- Bahasa apa pun diperbolehkan, tetapi tetap berpegang pada perpustakaan standar.
- Output tampilan. Sekali lagi, Anda bebas memilih formatnya, tetapi jelaskan formatnya di posting Anda. yaitu, bagaimana kita bisa tahu mana yang merupakan item tangan kiri dan mana yang merupakan item tangan kanan.
Poin
- Kode terpendek menang.
Petunjuk
Dua kemungkinan algoritma yang dapat saya pikirkan adalah diferensiasi (lebih cepat) dan permutasi / kombinasi (lebih lambat). Anda dapat menggunakan ini atau algoritma lain yang melakukan pekerjaan.
Jawaban:
Pyth, 9 byte
Input, format keluaran:
Demonstrasi.
Ini bekerja karena
y
mengembalikan himpunan bagian dalam urutan sehingga masing-masing bagian dan pelengkapnya sama dari pusat. Karena jumlah subset dan jumlah komplemennya akan selalu sama dari pusat, daftar setelahnyaosNyQ
juga akan memiliki properti ini. Dengan demikian, dua elemen tengahosNyQ
adalah pelengkap, dan harus memiliki pemisahan optimal. Kami mengekstrak yang pertama dari kedua elemen itu dan mencetaknya.sumber
s
yang membuatnya berhenti bekerja. Orang-orang tidak menyukai perubahan itu, dan komentar Anda adalah dorongan terakhir yang saya butuhkan untuk mengubahnya kembali.Pyth, 16
Ini mengambil input sebagai daftar pythonic pada STDIN. Outputnya adalah daftar 2 daftar dengan daftar pertama adalah item dalam satu tas, dan daftar kedua mewakili item dalam tas kedua. Brute ini memaksa semua kombinasi, sehingga akan berjalan sangat lambat (atau kehabisan memori) untuk input besar.
Cobalah online di sini
Untuk mendukung penanganan hanya satu input, ini naik hingga 17:
Ini akan mencetak nilai-nilai yang masuk dalam satu tangan.
sumber
[[2], [1], [1]]
, tapi saya pikir itu berhasil, karena cara./
kerjanya.[[x], []]
?CJam,
1918 byteIni adalah fungsi anonim yang memunculkan array bilangan bulat dari tumpukan dan mengembalikan array bilangan bulat yang dipisahkan oleh spasi.
Terima kasih kepada @ jimmy23013 untuk
:*
triknya yang cerdik , yang menghemat 1 byte.Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
Menunjukkan berat total tas belanja dengan W . Kemudian, jika tas di salah satu tangan memiliki berat W / 2 - D / 2 , yang di tangan lain harus memiliki berat dan W - (W / 2 - D / 2) = W / 2 + D / 2 .
Kami berusaha untuk meminimalkan perbedaan D . Tetapi (W / 2 - D / 2) (W / 2 + D / 2) = W ^ 2/4 - D ^ 2/4 , yang menjadi lebih besar karena D menjadi lebih kecil.
Dengan demikian, produk maksimal sesuai dengan perbedaan minimal.
sumber
:*
...W=
harus bekerja.Python 2.7,
161, 160kode
Algoritma
Periksa apakah setiap kombinasi semakin mendekati setengah dari total berat. Iterasi dan temukan yang terbaik.
memasukkan
keluaran
Tuple yang ditampilkan berjalan di satu tangan, yang tidak ditampilkan berjalan di tangan yang lain (tidak melanggar aturan).
sumber
from itertools import*
JavaScript ( ES6 ) 117
Menggunakan bit mask untuk mencoba setiap kemungkinan split, jadi terbatas pada 31 item (ok dengan aturan). Seperti jawaban ref, hasilnya hanya satu tangan. Catatan: saya mencari perbedaan minimum> = 0 untuk menghindari Math.abs, karena untuk setiap menit <0 ada yang lain> 0, hanya bertukar tangan.
Untuk menguji: jalankan snippet di Firefox, masukkan daftar angka koma atau spasi terpisah.
sumber
Haskell, 73 byte
Menghasilkan daftar item dalam satu tangan. Unsur-unsur yang hilang pergi ke sisi lain.
Penggunaan:
f [7,7,7,10,11]
->[7,7,7]
Untuk semua bagian selanjutnya
s
dari daftar inputl
hitung nilai absolut dari perbedaan berat antaras
dan elemen yang hilang daril
. Temukan minimum.sumber
Haskell, 51 byte
Format output adalah bahwa bobot kiri positif dan bobot kanan negatif.
Untuk menghasilkan setiap kemungkinan perpecahan, kami menggunakan
mapM(\x->[x,-x])l
untuk meniadakan setiap subset elemen yang mungkin. Kemudian, beri((,)=<<abs.sum)
label masing-masing dengan jumlah absolut dansnd$minimum$((,)=<<abs.sum)
ambil elemen berlabel terkecil.Saya tidak bisa mendapatkannya secara bebas karena masalah pemeriksaan jenis.
sumber
snd.minimum.map((,)=<<abs.sum).mapM(\x->[x,-x])
. Ini 47 byte. (walaupun saya memiliki versi yang lebih lama diinstal ...)R (234)
solusi yang lebih lama dan lebih lambat dengan R.
Fungsi:
Input - vektor yang diharapkan dengan bobot.
Output yang diharapkan - vektor dengan bobot untuk satu tangan.
Contoh
Versi kode yang dapat dibaca manusia:
sumber
Aksioma, 292 byte
Aplikasi brute force. Ini akan meminimalkan set
karena jika minimum
itu juga minimum
di mana (mengurangi (+, a)-mengurangi (+, r)) dan mengurangi (+, r) adalah 2 berat dua kantung. (Tetapi formula terakhir itu tidak menemukan minimum bagi saya, dalam aplikasi). Ungolf dan hasil
sumber