Teka-teki pertama dari saya, saran untuk perbaikan diterima dengan senang hati!
Skenarionya adalah; Anda bekerja sebagai manajer untuk perusahaan arung jeram. Setiap pagi, Anda diberikan daftar pemesanan, dan Anda harus mengurutkannya menjadi muatan rakit. Tulis program atau fungsi dalam bahasa pilihan Anda yang melakukan ini untuk Anda.
Setiap rakit menampung maksimal n
klien, dan setiap pemesanan adalah untuk grup antara 1 dan n
orang (termasuk). Aturan berikut harus diperhatikan;
Tidak ada grup yang dapat dipisahkan. Jika mereka memesan bersama, mereka semua harus berada di rakit yang sama.
Jumlah rakit harus diminimalkan.
Tunduk pada dua aturan sebelumnya, kelompok-kelompok tersebut harus disebarkan sepadan mungkin di antara rakit.
Input
Jumlahnya n
(Anda dapat berasumsi bahwa ini adalah bilangan bulat positif), dan ukuran semua pemesanan. Ini bisa berupa susunan, daftar atau struktur data serupa jika bahasa Anda mendukung hal-hal seperti itu. Semua ini akan menjadi bilangan bulat positif antara 1 dan n
. Urutan pemesanan tidak ditentukan, juga tidak penting.
Keluaran. Daftar nomor pemesanan, dikelompokkan ke dalam muatan rakit. Pengelompokan harus ditunjukkan dengan jelas, seperti;
- daftar, atau array array.
- daftar yang dipisahkan koma untuk setiap rakit. Baris baru di antara setiap rakit.
Bagaimana Anda menerapkan aturan ketiga itu terserah Anda, tetapi ini bisa melibatkan menemukan hunian rakit rata-rata, dan meminimalkan penyimpangan dari itu sebanyak mungkin. Berikut ini beberapa test case.
n Bookings Output
6 [2,5] [5],[2]
4 [1,1,1,1,1] [1,1,1],[1,1]
6 [2,3,2] [2,2],[3]
6 [2,3,2,3] [2,3],[2,3]
6 [2,3,2,3,2] [2,2,2],[3,3]
12 [10,8,6,4,2] [10],[8,2],[6,4]
6 [4,4,4] [4],[4],[4]
12 [12,7,6,6] [12],[7],[6,6]
Aturan standar berlaku, kode terpendek menang. Selamat bersenang-senang!
Diedit; Cara yang disarankan untuk mendefinisikan sama sederajat mungkin untuk aturan ketiga.
Setelah jumlah rakit r
telah ditentukan (tunduk pada aturan kedua), hunian rata-rata a
dapat dihitung dengan menjumlahkan pemesanan, dan membaginya dengan r
. Untuk setiap rakit, penyimpangan dari hunian rata-rata dapat ditemukan menggunakan d(x) = abs(n(x)-a)
, di mana n(x)
jumlah orang di setiap rakit dan 1 <= x <= r
. Untuk beberapa fungsi kontinu, bernilai-tunggal f(y)
, yang benar-benar positif dan memiliki turunan kedua yang benar-benar positif pertama dan non-negatif untuk semua positif y
, kami mendefinisikan kuantitas non-negatif F
, sebagai jumlah dari semua f(d(x)), 1 <= x <= r
. Setiap pilihan alokasi rakit yang memenuhi dua aturan pertama, dan di mana F
sama dengan minimum global akan memenuhi aturan ketiga juga.
sumber
g(y) = y
(kedua turunan nol) ataug(y) = y²
(pertama menurunkan nol ketikay = 0
).Jawaban:
Perl 6 ,
163158 byteCobalah online!
Bagaimana itu bekerja
Menghasilkan semua kemungkinan partisi dari semua permutasi dari input array.
Memfilter yang tidak memiliki rakit berlebih.
Memfilter yang jumlah rakitnya minimal.
Mendapat yang pertama dengan minimal ¢ (n x -a) 2 .
-4 byte terima kasih kepada @ Pietu1998
sumber
.abs
jika hasilnya sesuai?Haskell 226
228234268byteJawaban naif di Haskell
Atau ungolfed
Dengan beberapa test case
Di mana
test
hasilEdit
Terima kasih kepada @ flawr dan @nimi untuk sarannya.
Tergencet
p
sedikit.Memotong beberapa byte.
sumber
s=sum
dan kemudian menggunakans
bukannyasum
, dan mungkin Anda juga bisa menggantifst$ ...
dengan...!!0
.minimumBy(c s)
denganhead.sortOn s
dan menghapus fungsic
. Juga:\t->sum t<=n
adalah(<=n).sum
.Python3, 224 byte
Dengan testcases:
Bagaimana cara kerjanya?
The
p
Fungsi hanya menghasilkan semua partisi dari daftar yang diberikan (semua cara yang mungkin untuk membaginya menjadi sublists).s=sum
cukup mengganti nama fungsi penjumlahan, sehingga baris terakhir melakukan semua pekerjaan.Saya yakin ini bisa di-golf lebih jauh, terutama
p
fungsinya, tapi saya sudah mengerjakan ini selama berjam-jam, jadi begini.sumber