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]
sumber
Jawaban:
Bahasa Wolfram (Mathematica) ,
4120 byteCobalah online! Abaikan banyak peringatan, semuanya berhasil pada akhirnya.
Bagaimana itu bekerja
Untuk daftar kedalaman 2 seperti
{{1,2},{3},{4,5,6}}
,Tuples
akan menghasilkan daftar yang{{1,3,4},{1,3,5},{1,3,6},{2,3,4},{2,3,5},{2,3,6}}
sesuai dengan semua cara untuk mengambil elemen dari{1,2}
dan memilih elemen dari{3}
dan memilih elemen dari{4,5,6}
.Jika kita
Flatten
ini, maka kita mendapatkan semua elemen dengan frekuensi yang benar, karena memilih elemen dari salah satu{1,2}
,{3}
atau{4,5,6}
setara dengan memilih elemen dari semuanya, lalu memilih yang mana yang akan disimpan.Kami menggunakan
//@
untuk menerapkan ini di semua level input. Dalam prosesnya, Mathematica banyak mengeluh, karena itu mengubah atom seperti17
menjadiTuples[17]
, yang sebenarnya tidak seharusnya menjadi suatu hal. Tetapi ini disederhanakan untuk hasil yang benar nanti (Tuples
senang diperlakukanTuples[17]
sebagai daftar panjang 1, bahkan jika ia memiliki kepala selainList
), sehingga keluhan tidak relevan.sumber
Python 2 ,
10510299 byteCobalah online!
sumber
Jelly ,
98 byteCobalah online!
Bagaimana itu bekerja
sumber
Jelly , 10 byte
Cobalah online!
sumber
Python 2 , 128 byte
Cobalah online!
Port jawaban Jelly-ku.
Terima kasih untuk Jonathan Frech .
sumber
type(i)==int
bisai*0<[]
.0<[]
... dantype(i)==list
bisai*0>0
;)C (gcc) ,
234223 byteCobalah online!
Penjelasan:
sumber
Python 2 ,
144139 byteCobalah online!
sumber
JavaScript (ES6),
132131 byteTampilkan cuplikan kode
sumber