Tentang Seri
Pertama, Anda dapat memperlakukan ini seperti tantangan golf kode lainnya, dan menjawabnya tanpa khawatir tentang seri sama sekali. Namun, ada papan peringkat di semua tantangan. Anda dapat menemukan papan peringkat bersama dengan beberapa informasi lebih lanjut tentang seri di posting pertama .
Meskipun saya memiliki banyak ide untuk seri ini, tantangan di masa depan belum ditetapkan. Jika Anda memiliki saran, beri tahu saya di pos kotak pasir yang relevan .
Lubang 3: Partisi Integer
Saatnya menambah kesulitan sedikit.
Sebuah partisi dari bilangan bulat positif n
didefinisikan sebagai multiset bilangan bulat positif yang sum untuk n
. Sebagai contoh jika n = 5
, partisi berikut ada:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Perhatikan bahwa ini adalah multiset, jadi tidak ada urutannya {3,1,1}
,, {1,3,1}
dan {1,1,3}
semuanya dianggap identik.
Tugas Anda, diberikan n
, untuk menghasilkan partisi acak n
. Berikut aturan terperinci:
Distribusi partisi yang dihasilkan harus seragam . Artinya, dalam contoh di atas, setiap partisi harus dikembalikan dengan probabilitas 1/7.
Tentu saja, karena keterbatasan teknis PRNG, keseragaman yang sempurna tidak mungkin terjadi. Untuk tujuan menilai keseragaman kiriman Anda, operasi berikut akan dianggap menghasilkan distribusi seragam yang sempurna:
- Memperoleh nomor dari PRNG (pada rentang berapa pun), yang didokumentasikan sebagai (kurang-lebih) seragam.
- Memetakan distribusi seragam pada set angka yang lebih besar ke set yang lebih kecil melalui modulo atau multiplikasi (atau operasi lain yang mendistribusikan nilai secara merata). Set yang lebih besar harus mengandung setidaknya 1024 kali lebih banyak nilai yang mungkin dari set yang lebih kecil.
Karena partisi adalah multiset, Anda dapat mengembalikannya dalam urutan apa pun, dan urutan ini tidak harus konsisten. Namun, untuk tujuan distribusi acak, urutannya diabaikan. Yaitu, dalam contoh di atas
{3,1,1}
,,{1,3,1}
dan{1,1,3}
bersama - sama harus memiliki probabilitas 1/7 untuk dikembalikan.- Algoritme Anda harus memiliki runtime deterministik. Secara khusus, Anda tidak dapat membuat multiset acak dan menolaknya jika tidak dijumlahkan
n
. - Kompleksitas waktu algoritma Anda harus polinomial dalam
n
. Secara khusus, Anda tidak dapat hanya menghasilkan semua partisi dan memilih yang acak (karena jumlah partisi tumbuh secara eksponensial dengann
). Anda dapat berasumsi bahwa PRNG yang Anda gunakan dapat mengembalikan nilai yang didistribusikan secara seragam dalam O (1) per nilai. - Anda tidak boleh menggunakan fungsi bawaan yang menyelesaikan tugas ini.
Anda dapat menulis program atau fungsi lengkap dan mengambil input melalui STDIN atau alternatif terdekat, argumen baris perintah atau argumen fungsi dan menghasilkan output melalui nilai balik atau dengan mencetak ke STDOUT (atau alternatif terdekat).
Anda dapat mengasumsikan bahwa n ≤ 65
(sehingga jumlah partisi kurang dari 21 ). Output mungkin dalam format string atau daftar yang mudah, tidak ambigu.
Jika Anda mengirimkan fungsi, harap pertimbangkan juga untuk menyediakan program uji kecil yang memanggil fungsi beberapa kali dan mencetak hasilnya. Tidak apa-apa jika parameter harus di-tweak dalam kode. Ini agar orang dapat memeriksa bahwa solusinya setidaknya sekitar seragam.
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang. Dan tentu saja, pengiriman terpendek per pengguna juga akan masuk ke papan peringkat keseluruhan seri.
Papan peringkat
Pos pertama dari seri ini menghasilkan papan peringkat.
Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Bahasa saat ini tidak ditampilkan, tetapi cuplikan memang membutuhkan dan menguraikannya, dan saya dapat menambahkan leaderboard berdasarkan bahasa di masa mendatang.)