Diberikan string input S
, cetak S
diikuti oleh pemisah tidak kosong dengan cara berikut:
Langkah 1:
S
memiliki1/2
peluang untuk dicetak, dan1/2
kesempatan bagi program untuk berakhir.Langkah 2:
S
memiliki2/3
peluang untuk dicetak, dan1/3
kesempatan bagi program untuk berakhir.Langkah 3:
S
memiliki3/4
peluang untuk dicetak, dan1/4
kesempatan bagi program untuk berakhir....
Langkah
n
:S
memilikin/(n+1)
peluang untuk dicetak, dan1/(n+1)
kesempatan bagi program untuk berakhir.
Catatan
String input hanya akan terdiri dari karakter yang dapat diterima dalam tipe string bahasa Anda.
Pemisah non-kosong dapat digunakan, asalkan selalu sama. Diharapkan separator dicetak setelah cetakan terakhir
S
sebelum program berakhir.Program ini memiliki
1/2
peluang untuk mengakhiri sebelum mencetak apa pun.Baris baru yang tertinggal dapat diterima.
Jawaban Anda harus melakukan upaya tulus untuk menghormati probabilitas yang dijelaskan. Jelas, ketika
n
besar ini akan semakin tidak benar. Penjelasan yang tepat tentang bagaimana probabilitas dihitung dalam jawaban Anda (dan mengapa mereka menghormati spesifikasi, mengabaikan pseudo-randomness dan masalah angka besar) sudah cukup.
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jawaban:
Pyth , 7 byte
Cobalah online!
Bagaimana itu bekerja
Kodesemu:
sumber
C #,
9485 byteJawaban pertamaku!
Upaya sebelumnya (saya suka itu
goto
):Tidak Disatukan:
Catatan: dalam C #
Random.Next(N)
metode mengembalikan integer nonnegatif dalam kisaran [0, N-1], jadi kita bisa memeriksa bahwa angka yang dikembalikan lebih besar dari 0.sumber
using System;
ke dalam jumlah byte Anda. Anda dapat mendeklarasikanr
inline, tidak perlu mengaturnya untuk variabel:new Random().Next(i++)
. Anda tidak memerlukan tanda titik koma pada fungsi golf.new Random().Next(i++)
tetapi ketika saya mencoba menjalankannya, hasilnya selalu apakah program berhenti tanpa mencetak apa pun, atau program tidak pernah berhenti. Ketika saya mendeklarasikanr=new Random()
dan menggunakanr
variabel, program berhenti lebih acak ketika OP bertanya.R,
474643 byte43 byte karena Robin Ryder di komentar.
Cobalah online!
Penjelasan
sumber
function(s)
lebih pendek daris=scan(,'');
pryr::f(while(runif(1)<T/(T<-T+1))print(s))
bahkan lebih pendek.T
danF
dengan fungsi anonim, karena memodifikasi variabel global dan berarti bahwa fungsi tersebut hanya dapat dipanggil sekali. Lihat di sini : "fungsi solusi berkinerja konsisten terlepas dari berapa kali telah dipanggil sebelumnya".05AB1E , 8 byte
Cobalah online!
Penjelasan
sumber
Javascript,
605854 byteAkan menampilkan string
s
. Pemisah yang dicetak jika program berakhir adalahNaN
atau0
.Math.random()
mengembalikan nilai antara 0 dan 1. Jika nilai itu di bawahn/(n+1)
, makas
akan didahului.4 byte disimpan berkat @Neil
sumber
n/++n
?alert
alih-alihconsole.log
menyimpan 6 byte - snippet dapat diaturalert = console.log
untuk menampilkan keluaran yang tidak mencolok jika diinginkan (jika diizinkan - tidak menyimpan byte, hanya membantu menjaga agar tetap waras)Java 8,
726261 byte-10 byte terima kasih kepada @cliffroot .
-1 byte terima kasih kepada @JollyJoker .
Pembatas adalah baris baru.
Penjelasan:
Coba di sini.
sumber
if
kondisi ke dalamfor
blok kondisi?for
lingkaran.for
loop harus diakhiri sehingga tidak perlu eksplisitreturn
. Ekspresi kedua di dalam untuk pernyataan.int n=2
dan1f/n++
bekerja?Mathematica, 43 byte
JungHwan Min menyimpan 1 byte (di atas) dan menyarankan sesuatu yang lebih baik (di bawah)
Mathematica, 37 byte
sumber
RandomInteger@n!=0
sama sepertiRandomInteger@n<1
dalam kasus ini, dann++
dapat digabung denganRandomInteger@n
. Juga,For
hampir selalu lebih pendek dariWhile
: -5 byteFor[n=1,RandomInteger@n++>0,Print@#]&
For[n=1,!n∣Hash[# n++],Print@#]&
juga akan bekerja pada 34 byte, dengan asumsi hash cukup acak. Keacakan tergantung pada input, namun. Misalnya, coba% /@ Alphabet[]
Clojure,
6156 byteOh mengapa saya tidak pergi dengan
for
di tempat pertama? Tetapi sebenarnya untuk menjadi orang tuadoseq
harus digunakan sebagaimanafor
dievaluasi dengan malas.Asli:
sumber
(>(+(rand-int n)2)0)
selalu benar?n
!> <> ,
124112 byteCobalah online! (Anda juga dapat menontonnya di taman bermain ikan , tetapi karena beberapa bug Anda harus menambahkan
}
setelahl
di baris keempat dan menambahkan banyak baris baru setelah kode untuk membuatnya berfungsi dengan baik.)Keacakan rumit dalam> <>. Satu-satunya instruksi acak adalah
x
, yang mengambil arah ikan secara acak dari empat pilihan (kiri, kanan, atas dan bawah), sehingga mengubah itu menjadi sesuatu dengan probabilitas 1 / n tidak mudah.Cara kode ini melakukannya adalah dengan menggunakan kemampuan memodifikasi diri sendiri <> untuk membangun Tower of Randomness di bawah kode, jadi pada tahap keempat, misalnya, kode tersebut terlihat seperti:
Ikan mulai di bagian bawah menara. Pada setiap tingkat menara,
x
terperangkap di antara dua cermin, sehingga ikan hanya bisa melarikan diri dengan pergi ke kiri atau kanan. Salah satu dari arahan ini mengirimkan ikan ke tingkat menara berikutnya, tetapi ke kiri juga mendorong0
ke tumpukan. Pada saat ikan mencapai puncak menara, tumpukan berisi beberapa angka0
s, dan angka ini mengikuti distribusi binomial dengan n percobaan dan p = 1/2.Jika panjang tumpukan adalah 0 (yang memiliki probabilitas 1/2 n ), program berhenti. Jika panjangnya 1 (dengan probabilitas n / 2 n ), ikan akan mencetak input dan baris baru dan membangun tingkat menara yang lain. Jika panjangnya berbeda, ikan membuang tumpukan dan kembali ke dasar menara. Akibatnya, dari kemungkinan yang benar-benar melakukan sesuatu, n dari mereka mencetak string input dan salah satunya menghentikan program, memberikan probabilitas yang diperlukan.
sumber
Python 3 ,
726966 byteCobalah online!
sumber
random()<1/i
.randint
inklusif. Anda kemudian dapat mempersingkat baris itu menjadiwhile randint(0,i):print(s);i+=1
QBIC ,
1917 byteConditional yang dijatuhkan
=1
, diaktifkan, disimpan 2 bytePenjelasan
sumber
Braingolf , 23 byte
Cobalah online!
Menghasilkan angka acak di
x
mana0 <= x < n+1
, berakhir jikax
0, jika tidak, kenaikann
dan putaran. Pemisah adalah|
Penjelasan:
sumber
Alice , 18 byte
Cobalah online!
Penjelasan
sumber
PHP , 31 byte
Cobalah online!
sumber
Perl, 26 byte
Kode 24 byte + 2 untuk
-nl
.Cobalah online!
sumber
Arang , 14 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Digunakan
_
sebagai pemisah. Catatan: caching keluaran dinonaktifkan, jadi jangan palu server Dennis!sumber
MATL , 9 byte
Cobalah online!
Penjelasan
sumber
Perl 6 ,
50 41 38 3626 byteCobalah
Cobalah
Cobalah
Cobalah
(dengan
-n
argumen commandline)Cobalah
sumber
Python 3 , 55 byte
Penjelasan
Untuk menyimpan harus mengimpor secara acak, saya telah mengeksploitasi fakta bahwa hash built-in diunggulkan secara acak setiap kali proses python dinyalakan (setidaknya dalam MacOS). Setiap hash hash terakhir harus menghasilkan serangkaian bilangan bulat pseudo-acak.
Jika hash cukup pseudo-acak, modulo dengan
i
nol dengan probabilitas1/i
.Catatan
Saya sedikit terganggu oleh hash yang berlebihan, tetapi tanpa tugas do-while, atau dalam-kondisi dalam Python, saya agak macet.
sumber
I'm a little bothered...
rekursi?C #
Panjangnya sama dengan jawaban C # teratas, tetapi:
Hanya ingin menunjukkan bahwa beberapa matematika dapat menghasilkan probabilitas yang benar.
Setara dengan
Dan fungsi f (x) = 1 / x-1 adalah:
f (1) = 0
f (1/2) = 1
f (1/3) = 2
f (1/4) = 3
Jadi 1/2 kesempatan untuk dibulatkan menjadi 0, 1/6 kesempatan untuk dibulatkan menjadi 1, dan 1 / (n +1) (n + 2) peluang dibulatkan menjadi n.
Mungkin bahasa lain bisa memanfaatkan ini.
EDIT: Memperbaiki kesalahan saya
Saya memikirkan sesuatu untuk membuatnya lebih kecil.
EDIT EDIT: Saya semua jenis kesalahan. Menarik Acak ke luar dari loop karena jika itu dievaluasi berulang kali, itu tidak akan berhasil.
EDIT EDIT EDIT: Saya menyingkirkan variabel i. Saya akan berhenti mencoba mengecilkannya sekarang. Tidak, berbohong. Singkirkan byte lain.
sumber
Arang , 17 byte
Cobalah online! Kode verbose disertakan. Menghargai spesifikasi karena menggunakan rentang acak dari
0
hinggan
.sumber
C, 41 byte
Diasumsikan
rand
diunggulkan. Cobalah online!sumber
rand
diunggulkan." - Apakah itu asumsi yang valid untuk dibuat?rand
diperlukan oleh standar untuk memiliki nilai seed tetap 1 secara default dan semua implementasi yang saya tahu lakukan hal itu. Jika fungsi ini hanya melakukan apa yang ditanyakan ketika dikombinasikan dengan kode lain, saya pikir kode lain perlu dimasukkan dalam jawaban dan dalam jumlah byte.braingasm , 22 byte
sunting: Jumlah byte yang sama, tetapi saya menyadari bahwa saya dapat menyelinap di fitur baru tape
L
imit.Digunakan
0
sebagai pemisah. Bekerja seperti ini:sumber
Python , 54 byte
Cobalah online!
Generated jumlah salinan sebagai
floor(1/p)-1
denganp
seragam dipilih dari interval satuan. Jumlah salinan adalahn
saat1/p-1
jatuh di antaran
dann+1
, yang terjadi saat1/(n+2) < p < 1/(n+1)
. Ini terjadi dengan probabilitas1/(n+1)-1/(n+2)
atau1/((n+1)*(n+2)
. Ini adalah probabilitas yang diinginkan untuk menghasilkann
salinan:1/2
prob 0,1/6
prob 1,1/12
prob 2, ...sumber
form random import*
di bawah?f=
dan menempatkannya di TIO HeaderC ++,
979657 byteDi sini coba pertama saya di codegolf :)
Saya menyimpan satu byte dengan menggunakan
for
Disimpan 39 byte karena tampaknya tidak ada yang menghitungnya
ungolfed
sumber
F #, 161 byte
Jelas bukan bahasa terbaik untuk golf, tetapi saya memutuskan untuk mencobanya (selain itu, saya tidak tahu apa-apa tentang F #, jadi setiap tips tentang bagaimana meningkatkan jawaban saya akan diterima).
Jalankan dengan:
Menulis baris baru sebagai pemisah.
sumber
Ruby , 29 + 1 = 30 byte
Menggunakan
-n
bendera.Cobalah online!
sumber
puts$_
denganprint
tetapi tidak jelas aturan yang mendukungnya.JS (ES6), 47 byte
Berbeda dengan jawaban ES6 lainnya, ini menggunakan for for dan alert bom bukannya rekursi. Pemisah yang dicetak ketika program berhenti tidak ditentukan.
sumber
PowerShell, 31 byte
Get-Random $i
output din
mana0 <= n < $i
, pemisah adalah baris baru implisit.sumber
Python, 75 byte
Jawaban Python lainnya lebih pendek, tetapi saya ingin mencobanya dengan cara yang berbeda:
sumber