Tantangan ini agak sederhana:
Anda diberi array bilangan bulat positif (tidak termasuk 0), dan harus memilih elemen acak dari array ini.
Tapi inilah twistnya:
Probabilitas memilih elemen tergantung pada nilai integer, artinya ketika integer tumbuh lebih besar, probabilitas untuk dipilih juga!
Contoh
Anda diberi array [4, 1, 5]
.
Probabilitas memilih 4 sama dengan 4 dibagi dengan jumlah semua elemen dalam array , dalam hal ini 4 / ( 4 + 1 + 5 ) = 4 / 10 =
40%
.
Probabilitas memilih 1 adalah 1 / 10
atau 10%
.
Memasukkan
Array bilangan bulat positif.
Keluaran
Kembalikan bilangan bulat yang dipilih jika menggunakan metode, atau langsung cetak ke stdout
.
Aturan
- Ini adalah kode-golf sehingga kode terpendek dalam byte menang dalam bahasa apa pun.
- Celah standar dilarang.
code-golf
array-manipulation
random
Ian H.
sumber
sumber
R , 25 byte
Cobalah online!
Penjelasan:
Mengambil sampel dari
s
ukuran1
tanpa penggantian, dengan bobots
; ini di-rescaled menjadi probabilitas.Untuk memverifikasi distribusi, gunakan tautan ini .
sumber
Pyth , 4 byte
Coba di sini.
Disimpan satu byte, terima kasih kepada @Jakube, dengan pendekatan yang agak tidak biasa.
Pyth , 5 byte
Coba di sini!
Bagaimana?
# 1
# 2
sumber
OsmL
atauOsmR
d
, lalu petakand
pada rentang ... jenius!CJam (9 byte)
Demo online . Ini adalah program lengkap yang mengambil input dalam format array CJam pada stdin dan mencetak elemen yang dipilih ke stdout.
Pembedahan
sumber
Perl 6 , 20 byte
Disimpan 1 byte berkat @Brad Gilbert b2gills.
Cobalah online!
Ini membutuhkan 1 argumen daftar. Kami menyalin 2 salinan daftar ini menggunakan
xx
operator. Jadi dengan@_ Zxx@_
, kita mendapatkan daftar di mana elemenx
disajikanx
kali. Itu kemudian dipaksaBag
, yang merupakan koleksi yang menyimpan objek bersama dengan berapa kali mereka muncul dalam koleksi. Akhirnya, kami memilih elemen acak dari koleksi inipick
, yang memasukkan jumlah ke dalam akun dan melakukan The Right Thing ™.sumber
{bag(@_ Z=>@_).pick}
{bag(@_ Zxx@_).pick}
Python 3.6 , 44 byte
Yay untuk built-in. Yang lain
A
dichoices(A, A)
adalah opsionalweights
argumen.Cobalah online!
sumber
MATL ,
86 byteCobalah di MATL Online!
Penjelasan
sumber
Mathematica, 19 byte
sumber
Ruby , 32 byte
Cobalah online!
sumber
Python 3 , 62 byte
Cobalah online!
sumber
Java (OpenJDK 8) ,
88878683 byteCobalah online!
sumber
for(r*=Math.random();;)
ini diperlukan, atau jika semua yang Anda butuhkanr*=Math.random()
.for(;;)
loop ini akan membutuhkan pernyataan kembali kedua (tidak pernah tercapai) setelahfor(int i:a)...
untuk memenuhi kompiler - yang akan menjadi 3 byte lebih lama.for(int i:a)
sepertiforeach
di C #. Saya memiliki masalah yang sama, tetapi hanya menggunakanfor
loop yang terus menerus. Jawaban baru Anda membuat saya penasaran, saya mungkin mencoba dan mencuri beberapa ide Anda.J,
878 byte7 byter tidak valid; Saya akan mengembalikan ini ke suntingan sebelumnya ketika saya kembali ke komputer saya dalam satu atau dua hari.
Cobalah online!
:( memilih elemen acak dari sebuah array itu mahal.
8 byte
9 byte
Penjelasan
sumber
?@+/
adalah(?@+)/
; Saya khawatir Anda harus menabraknya hingga 8 lagi ...JavaScript (ES6), 50 byte
Semoga ini jelas bagaimana ini bekerja, tetapi saya akan menjelaskannya di sini. Ini mengurutkan bilangan bulat dalam urutan menurun, lalu memilih satu secara acak dengan distribusi beta (1 / 2,1) .
sumber
a=[4,1,5]
, Anda akan mendapatkan sekitar 18%1
, 24%4
, dan 58%5
, yang menunjukkan Anda akan mendapatkan distribusi itu dengan input panjang 3.05AB1E , 9 byte
Cobalah online!
sumber
PowerShell , 27 byte
Cobalah online!
Mengambil input
$args[0]
sebagai array literal. Loop melalui setiap elemen|%{...}
dan setiap iterasi membangun sebuah array baru,$_
dari$_
elemen - misalnya, untuk4
ini akan menciptakan sebuah array@(4,4,4,4)
. Elemen-elemen array tersebut kemudian disalurkan keGet-Random
mana akan memetik salah satu elemen dengan probabilitas (pseudo) yang sama. Karena, misalnya, untuk@(4,1,5)
ini memberi kita@(4,4,4,4,1,5,5,5,5,5)
ini memenuhi persyaratan probabilitas.sumber
C # (.NET Core) ,
93898776 + 18 = 94 byteCobalah online!
Tambahan 18 byte untuk
using System.Linq;
Ucapan Terima Kasih
11 byte disimpan berkat Nevay, yang penerapan angka acaknya jauh lebih ringkas (dan juga
int
bukan adouble
).Merosot
Penjelasan
Dapatkan angka acak
r
,, antara 0 dan jumlah elemen. Kemudian pada setiap iterasi kurangi elemen saat ini darir
. Jikar
kurang dari0
, maka kembalikan elemen ini. Idenya adalah bahwa ada bagian yang lebih besar dari angka acak untuk angka yang lebih besar dalam array.sumber
a=>{int i=-1,r=new Random().Next(a.Sum());for(;r>=0;)r-=a[++i];return a[i];}
Japt , 7 byte
Uji di sini
Penjelasan
Input array secara implisit
U
.Peta di atas array yang melewati setiap elemen melalui fungsi di mana
D
elemen saat ini.Hasilkan array panjang
D
dan isi denganD
.Meratakan.
Dapatkan elemen acak.
sumber
CJam , 5 byte
Cobalah online! Catatan: pisahkan angka dengan spasi
sumber
Perl, 31 byte
Ini mengasumsikan input menjadi argumen baris perintah. Perhatikan bahwa mungkin kehabisan memori jika jumlahnya besar.
sumber
Perl 5 , 31 + 1 (-a) = 32 byte
Cobalah online!
sumber
GolfScript , 17 byte
Cobalah online!
sumber
Arang , 12 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Karena Charcoal mencoba menjadi terlalu pintar, saya harus menggunakan input titik koma untuk array. Penjelasan:
sumber
Haskell , 87 byte
Cobalah online!
sumber
Javascript (ES6),
6154 byte-7 byte terima kasih kepada @Justin Mariner
Cuplikan kode contoh
sumber
eval(a.join`+`)
alih-alihreduce
.[].find(m=>(n-=m)<0,n=Math.random()*eval(a.join
+))
dan menelepon denganinput::[].find(...)
Haskell ,
7877 byteCobalah online! Contoh penggunaan:
f [1,99]
mungkin menghasilkan99
.Penjelasan:
f
mengambil daftar bilangan bulatl
dan mengembalikan bilangan bulat yang dipilih secara acak sebagaiIO Int
.l>>= \n->n<$[1..n]
membangun daftar dengan setiap elemenn
diulangn
kali.randomRIO(0,sum l-1)
menghasilkan bilangan bulat dalam rentang dari 0 hingga panjang daftar elemen berulang, yang merupakan jumlah keseluruhan dari semua elemen, minus satu untuk menghindari pengecualian yang tidak terikat.Bonus: versi bebas byte 85 byte
Cobalah online!
sumber
Bash , 51 byte
Mengambil input yang dipisahkan oleh spasi atau dipisahkan oleh baris baru dalam satu argumen atau beberapa argumen.
Cobalah online!
Validasi frekuensi acak dengan test case yang lebih rumit.
sumber
Java 8,
127122121 byte-1 byte terima kasih kepada @Nevay .
Gunakan pendekatan yang mirip dengan jawaban Jelly @ErikTheOutgolfer , dengan menambahkan
n
kali itemn
ke daftar, lalu pilih satu secara acak dari daftar itu.Penjelasan:
Coba di sini.
sumber
#shuffle
panggilan ke loop untuk menyimpan 1 bytefor(int j=i;j-->0;Collections.shuffle(l))l.add(i);
.Dyalog APL , 8 byte
Cobalah online!
Bagaimana?
/⍨
,n
salinann
untuk masing-masingn
dalam argumen.⌷⍨
, pada indeks1?
, nilai acak antara1
dan+/
, jumlah argumensumber
GNU APL 1.2,
2623 bytes; 1,72119 bytePendekatan terinspirasi oleh jawaban Erik the Outgolfer's Jelly . Bergantung pada
⎕IO
0 bukan 1, yang merupakan default untuk GNU APL (semacam +5 byte untuk⎕IO←0
).-3, -2 bytes berkat @ Zacharý
∇
bentuk fungsiFormulir lambda anonim
Untuk penjelasannya, saya akan gunakan
⍵
untuk mewakili argumen yang dilewatkan ke fungsi, tetapi itu setara denganR
dalam∇
bentuk.⍵∘.⍴⍵
menghitung produk luar pada daftar menggunakan⍴
operator membentuk kembali ( ). Secara efektif, ini membuat tabel (seperti tabel perkalian) tetapi alih-alih mengalikannya, ia mengulangi elemen di kolom beberapa kali sama dengan elemen di baris. Untuk contoh yang diberikan dalam pertanyaan, ini adalah:0 0⍉⍵∘.⍴⍵
transposes matriks dan hanya mengembalikan diagonal utama. Ini memberi kita hanya bagian di mana baris dan kolom dalam⍵∘.⍴⍵
adalah sama yaitu kita mengulangi angka beberapa kali sama dengan nilainya. Sebagai contoh, ini adalah:∊
mengubah argumennya menjadi daftar. Menggunakan⍉
operator transpose ( ), kami mendapat vektor yang berisi 3 vektor. Daftar (∊
) mengubahnya menjadi satu vektor yang berisi semua elemen.S←...
menetapkan vektor baru ini ke vektorS
.⍴S
memberi kita panjang dari daftar itu.?
adalah operator acak, jadi?⍴S
beri kami angka acak antara 0 dan panjang daftar (eksklusif) (inilah sebabnya ia bergantung pada⎕IO
0; jika tidak, antara 1 dan panjangnya, termasuk).S[...]
mengembalikan elemen pada indeks yang diberikan.sumber
Q
, karena Anda tidak pernah menggunakannya. Dan IIRC Anda dapat menghapus baris baru sebelum del (hal segitiga kecil yang menandai akhir fungsi.)<IO> <IO>⍉
untuk mendapatkan diagonal utama bahkan hal!MATLAB, 30 byte
Ini mengasumsikan MATLAB R2015a atau lebih baru dan dengan toolbox Statistics & Machine Learning diinstal.
Lihat penjelasan di bawah ini untuk cara
repelem
penggunaannya. Perbedaan antara yang lebih pendek dan yang di bawah ini adalah bahwa kotak alat S&ML mencakup fungsidatasample
yang dapat digunakan untuk mengambil satu atau lebih elemen dari array secara acak (dengan probabilitas seragam) yang memungkinkan digunakannya fungsi anonim, menghilangkaninput/disp
panggilan.MATLAB, 49 byte
Kode ini mengasumsikan bahwa MATLAB R2015a atau yang lebih baru digunakan saat
repelem
fungsi diperkenalkan.repelem
adalah fungsi yang mengambil dua parameter, yang pertama adalah array angka untuk direplikasi, dan yang kedua adalah array berapa kali elemen yang sesuai harus direplikasi. Pada dasarnya fungsi melakukan decoding run-length dengan memberikan nomor dan run-length.Dengan memberikan input yang sama untuk kedua input
repelem
kita berakhir dengan sebuah array yang terdiri dari n kali lebih banyak elemen n jika itu masuk akal. Jika Anda memberi[1 2 3]
Anda akan mendapatkan[1 2 2 3 3 3]
. Jika Anda memberi[1 2 4 2]
Anda akan mendapatkan[1 2 2 4 4 4 4 2 2]
. Dengan melakukan ini berarti jika kita memilih elemen dengan probabilitas seragam (randi(m)
memberikan bilangan bulat acak dari 1 ke m dengan probabilitas seragam), setiap elemen n memiliki probabilitas n kali lebih tinggi untuk dipilih. Pada contoh pertama[1 2 3]
,1
akan memiliki peluang 1/6,2
akan memiliki peluang 2/6 dan3
akan memiliki peluang 3/6.Sebagai catatan tambahan, karena
repelem
belum tersedia untuk Octave, saya tidak dapat memberikan tautan TIO. Selain itu karena Oktaf tidak dapat digunakan ada hukuman karakter besar karenainput()
dan tidakdisp()
perlu digunakan sebagai fungsi anonim. Jika Oktaf didukungrepelem
, berikut ini dapat digunakan:Itu akan menghemat 16 byte, tetapi itu tidak terjadi.
sumber