Pertimbangkan proses "memilih" daftar bersarang. Memilih didefinisikan sebagai berikut:
- Jika argumennya adalah daftar, ambil elemen dari daftar secara acak (seragam), dan pilih dari sana.
- Jika argumennya bukan daftar, kembalikan saja.
Contoh implementasi dengan Python:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
Untuk mempermudah, kami menganggap bahwa daftar bersarang hanya berisi bilangan bulat atau daftar bersarang lebih lanjut.
Diberikan daftar apa pun, dimungkinkan untuk membuat versi rata yang tidak dapat dibedakan dengan pick
, yaitu memilih dari itu menghasilkan hasil yang sama, dengan probabilitas yang sama.
Misalnya, "pilih rata" daftar
[1, 2, [3, 4, 5]]
menghasilkan daftar
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. Alasan hanya meratakan tidak valid adalah karena unsur-unsur sub-daftar memiliki probabilitas yang lebih rendah untuk dipilih, misalnya dalam daftar [1, [2, 3]]
1 memiliki peluang 2/4 = 1/2 dipilih sementara 3 dan 4 keduanya memiliki 1/4 kesempatan masing-masing.
Perhatikan juga bahwa memilih dari daftar tunggal sama dengan memilih dari elemennya, dan memilih dari daftar kosong tidak ada artinya.
Tantangan
Diberikan daftar bertumpuk dari bilangan bulat negatif, kembalikan daftar bulat bilangan bulat negatif yang dari situ memilih menghasilkan hasil yang sama dengan probabilitas yang sama.
Ini adalah kode-golf , sehingga jawaban terpendek yang valid (diukur dalam byte) menang.
Spesifikasi
- Input
[2, 3, 4]
,,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
dan[2, [3, 3], [[4]]]
setara (yaitu mereka harus memberikan hasil yang setara). - Keluaran
[2, 2, 2, 2, 3, 3, 3, 3]
dan[2, 3]
setara (yaitu salah satu yang bisa menjadi keluaran). - Anda dapat mengasumsikan hanya angka dalam kisaran inklusif 1-100 yang akan ada dalam daftar.
- Anda dapat mengasumsikan input tingkat atas akan menjadi daftar, yaitu
2
bukan input yang valid. - Anda dapat menggunakan representasi yang wajar dari daftar bersarang, misalnya:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
, dll - Alih-alih daftar, Anda dapat menampilkan multiset atau pemetaan, atau, karena hanya angka dalam kisaran 1-100 yang diizinkan, daftar panjang-bilangan bulat 100 yang mewakili jumlah.
Uji Kasus
Perhatikan bahwa output yang terdaftar hanya satu kemungkinan yang valid; lihat spesifikasi untuk apa yang merupakan input atau output yang valid.
format:
input -> output
[3] -> [3]
[1, [1, 1]] -> [1]
[1, [2, 3]] -> [1, 1, 2, 3]
[2, 3, [4, [5, 5, 6], 6, 7]] -> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7]
[[1, 1, 2], [2, 3, 3]] -> [1, 2, 3]
[[1, 1, 2], [2, 3, 3, 3]] -> [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]