Kode Nugget
Ini adalah situasi hipotetis di mana hari Jumat malam, dan Anda telah mengundang teman bermain golf yang biasa untuk berpartisipasi dalam hobi favorit Anda: golf kode. Namun, karena ini adalah tugas yang menguras otak, Anda perlu mengambil beberapa makanan otak untuk grup sehingga Anda dapat bermain golf sebanyak mungkin dari kode Anda.
Sekarang, camilan favorit semua orang adalah chicken nugget, tetapi ada masalah: Tidak ada satu pun dari mereka yang memenuhi kebutuhan semua orang. Jadi, karena Anda sudah berada dalam suasana golf, Anda memutuskan untuk membuat program yang menentukan paket apa yang harus Anda beli untuk dapat memenuhi kebutuhan Nugget semua orang.
Ukuran paket nugget ayam ada di semua tempat, dan tergantung di mana Anda tinggal di dunia, ukuran standar juga berubah. Namun, [tempat terdekat yang menyediakan nugget] terdekat menyediakan paket nugget ukuran berikut:
4, 6, 9, 10, 20, 40
Sekarang Anda mungkin memperhatikan bahwa Anda tidak dapat memesan kombinasi nugget tertentu. Misalnya, 11
nugget tidak dimungkinkan, karena tidak ada kombinasi yang sama 11
persis. Namun, Anda dapat membuatnya 43
dengan mendapatkan 1 bungkus 20
, 1 bungkus 10
, 1 bungkus 9
dan 1 bungkus 4
,
20 + 10 + 9 + 4 = 43 (597)
di mana 597
setiap istilah kuadrat dan ditambahkan bersama-sama (petunjuk: solusi optimal memiliki ini sebagai nilai tertinggi) . Tentu saja ada cara lain untuk membuatnya 43
, tetapi seperti yang Anda tahu, semakin banyak nugget per bungkus, semakin murah nugget per paket. Jadi, Anda ingin membeli secara ideal jumlah paket paling sedikit dan dalam jumlah terbesar untuk meminimalkan biaya Anda.
Tugas
Anda harus membuat program atau fungsi yang mengambil daftar bilangan bulat yang sesuai dengan kebutuhan setiap orang. Anda kemudian harus menghitung dan mencetak pesanan α paling efisien untuk membeli nugget ayam. Urutan α yang paling hemat biaya adalah kombinasi dimana jumlah kuadrat dari setiap kuantitas adalah yang tertinggi. Jika sama sekali tidak ada cara untuk membeli nugget dengan sempurna, Anda harus mencetak nilai palsu seperti0
, False
, Impossible!
, atau apa pun yang tersedia dalam bahasa Anda.
Contoh I / O:
[2 7 12 4 15 3] => [20 10 9 4]
1, 1, 2, 1 => False
6 5 5 5 5 5 9 => 40
[6, 4, 9] => 9 10
1 => 0
199 => 40, 40, 40, 40, 20, 10, 9
2 => Impossible!
Sini adalah daftar solusi ideal untuk 400 yang pertama. Perhatikan ini tidak diformat seperti yang saya harapkan dari Anda, masing tuple
- masing ada dalam formulir (N lots of M)
.
Aturan
- Tidak ada celah standar.
- Tidak menggunakan fungsi bawaan yang melakukan semua atau sebagian besar tugas, seperti
FrobeniusSolve
di Mathematica.
α - Untuk mengklarifikasi ini dengan sebuah contoh, Anda juga dapat membuat 43 dengan melakukan 4 + 6 + 6 + 9 + 9 + 9 = 43 (319)
, tetapi ini tidak akan optimal, dan dengan demikian output yang salah, karena jumlah kuadrat kurang dari kombinasi yang saya catat dalam pendahuluan. Pada dasarnya, jumlah kuadrat yang lebih tinggi = biaya lebih rendah = paling hemat biaya.
Jawaban:
Pyth,
2625 bytePerhatikan bahwa ada beberapa karakter yang tidak diinginkan. Cobalah online: Demonstrasi . Ini cukup lambat (tapi tidak selambat solusi 26 byte saya).
Penjelasan:
Pyth, 32 byte
Perhatikan bahwa ada beberapa karakter yang tidak diinginkan. Cobalah online: Peragaan Versi ini jauh lebih cepat. Ia menemukan solusi untuk input
[6,7,8]
dalam waktu sekitar satu detik dan solusi untuk input[30]
dalam waktu sekitar 90 detik.Penjelasan:
sumber
.a
metode ini lebih pendek dari mengkuadratkan dan menjumlahkans^R2
.Perl,
175153Mengambil input dari argumen program. Mencetak :( jika tidak dapat menemukan solusi yang sempurna.
Kode Tidak Terkunci:
PS: Ini mungkin entri pertama yang tidak membutuhkan waktu 10 menit
1 2
;)Lihat disini.
sumber
18
harus dicetak9 9
, bukan4 4 10
.9
dan10
.CJam,
452928 bytePerhatikan bahwa pendekatan ini sangat lambat dan intensif memori.
Cobalah online di juru bahasa CJam .
Ini dapat dipercepat secara signifikan dengan biaya 5 byte:
Kompleksitas masih eksponensial dalam jumlah input, tetapi ini harus menangani kasus uji hingga 159 dengan penerjemah online dan hingga 199 dengan penerjemah Java dalam beberapa detik.
Cobalah online di juru bahasa CJam .
Ide
Pembelian yang optimal (jumlah maksimal dari kotak) adalah pembelian yang sah (jumlah yang benar nugget) yang memiliki banyak 40 's mungkin, maka sebanyak 20 ' s mungkin, maka sebanyak 9 's mungkin (misalnya,
9 9
adalah lebih disukai daripada10 4 4
) dan sebagainya untuk 10 , 6 dan 4 .Dalam pendekatan ini, kami menghasilkan produk Cartesian dari N salinan array [40 20 9 10 6 4 0] , di mana N adalah jumlah nugget yang diinginkan. N adalah batas atas (buruk) untuk jumlah pembelian yang harus kita lakukan. Dalam versi kode yang dipercepat, kami menggunakan N / 40 + 4 sebagai gantinya.
Karena cara susunannya diatur, produk Cartesian akan mulai dengan vektor [40 ... 40] dan berakhir dengan vektor [0 ... 0] . Kami menghitung indeks vektor pertama yang memiliki jumlah yang benar (yang juga akan memiliki jumlah kuadrat optimal), mengambil elemen array yang sesuai, menghapus nol yang berfungsi sebagai penampung dan mencetak hasilnya.
Jika tidak ada vektor yang ditemukan, indeksnya akan -1 , jadi kami mengambil [0 ... 0] , yang akan mencetak array kosong.
Kode
sumber
Julia, 126 byte
Ini menciptakan fungsi tanpa nama yang menerima array sebagai input dan mencetak array atau boolean ke STDOUT, tergantung pada apakah ada solusi. Untuk menyebutnya, berikan nama, mis
f=n->...
.Penjelasan + tidak dikumpulkan:
Contoh:
sumber
Python 3 - 265 karakter
Menampilkan jarak:
Lewati semua kasus uji
Catatan: Saya tidak tahu apakah ini akan melewati semua kasus karena sangat lambat ... Tetapi seharusnya ...
sumber
from blah import*
itu selalu yang terbaik. Satu-satunya pengecualian yang dapat saya pikirkan di atas adalah jika Anda memiliki banyakimport
s, yang merupakan satu-satunya waktu yang terlintas di pikiran di manaas
sebenarnya berguna.JavaScript,
261256261Saya tidak yakin apakah ini baik-baik saja, sepertinya berfungsi tetapi saya pasti kehilangan beberapa hal.
Ini tampaknya tidak menjadi lambat meskipun, sampai
123456
itu output[40 x 3086, 10, 6]
hampir immediatly.Penjelasan:
Mengurangi ukuran nugget (terbesar pertama)
Untuk 199 | 1 tumpukan yang dibangun terlihat seperti ini
Untuk 1
sumber
11
cetak[6]
dan18
cetak[10, 4]
.[10,4]
karena saya kehilangan sepasang parens. Cek itu memang salah, saya hanya memeriksa apakah ada setidaknya satu elemen di resultset, tidak jika dijumlahkan dengan benar. Saya tidak tahu apa yang saya pikirkan di sana