Tentang Seri
Ini adalah entri tamu untuk seri Golf Acak Hari ini.
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 .
Memasukkan
Tidak ada input yang diambil.
Keluaran
Satu huruf alfabet (huruf tidak relevan), dengan baris tambahan opsional. Setiap huruf harus memiliki probabilitas bukan nol untuk dipilih, dan ke-26 probabilitas harus berbeda . Untuk menghapus semua ambiguitas: Perbedaan berarti bahwa tidak boleh ada dua probabilitas yang sama satu sama lain.
Mencetak gol
Ini kode golf. Kode terpendek dalam byte menang.
Entri yang valid adalah program atau fungsi lengkap yang memiliki probabilitas nol untuk tidak berakhir.
Alfabet
Untuk menghindari kebingungan, alfabet tertentu yang digunakan adalah alfabet Latin:
Antara
ABCDEFGHIJKLMNOPQRSTUVWXYZ
atau
abcdefghijklmnopqrstuvwxyz
Anda dapat memilih untuk menampilkan huruf besar atau kecil. Sebagai alternatif, Anda dapat memilih untuk menampilkan kasing yang berbeda pada run yang berbeda jika itu membantu. Probabilitas untuk huruf tertentu adalah probabilitas huruf itu muncul dalam kedua kasus (atas atau bawah).
Penjelasan
Karena tidak akan terlihat jelas dari output, harap sertakan penjelasan yang jelas tentang bagaimana Anda mencapai 26 probabilitas yang berbeda.
Papan peringkat
(dari sini )
Posting pertama dari seri ini juga menghasilkan leaderboard keseluruhan.
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 bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
## 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.)
A
bukan65
.Jawaban:
Pyth, 5
Coba di sini
Menghitung awalan abjad, sehingga:
["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]
. Kemudian ratakan daftar dan pilih elemen acak dari itu secara seragam. Ini berarti bahwa sejaka
muncul 26 kali, sementarab
muncul 25 kali, semuanyaz
dengan hanya 1 penampilan, setiap huruf memiliki peluang berbeda untuk muncul. Total string memiliki 351 karakter.sumber
MATL, 6 Karakter
Penjelasan:
Xr
Ambil nomor acak yang didistribusikan secara normal)
Gunakan ini untuk mengindeks ke ...1Y2
AlfabetDistribusi simetris sekitar 0, dan terjemahan angka ke char simetris sekitar 0,5. Dengan demikian probabilitasnya harus berbeda.
sumber
05AB1E , 6 byte
Kode
Penjelasan
Kami sekarang memiliki string berikut:
Setelah itu, kami memilih elemen acak menggunakan
.R
.Peluangnya
Cobalah online! .
sumber
Jelly , 5 byte
Cobalah online!
Bagaimana itu bekerja
Latar Belakang
Biarkan L 0 , ..., L 25 menunjukkan huruf-huruf alfabet dalam rangka alami mereka, dan S 0 , ..., S 25 yang seragam di permutasi yang dipilih secara acak dari L . Tentukan urutan berhingga M oleh M n = maks (L n , S n ) .
Perbaiki n dalam 0, ... 25 dan tentukan k sebagai indeks sehingga L n = S k .
Dengan probabilitas 1/26 , L n = S n dan n = k , sehingga M n = L n dan L n occurrs sekali dalam M .
Dengan probabilitas 25/26 , L n ≠ S n dan n ≠ k . Dalam hal ini, berikut ini terjadi.
Dengan probabilitas n / 25 , S n adalah salah satu dari L 0 , ..., L n - 1 , jadi L n > S n dan M n = L n .
Secara independen, juga dengan probabilitas n / 25 , k adalah salah satu dari 0, ... n - 1 , jadi S k > L k dan M k = S k = L n .
Dengan demikian, jumlah kejadian yang diharapkan dari L n di M adalah 1/26 + 25/26 · (n / 25 + n / 25) = (2n + 1) / 26 .
Akhirnya, jika kita sekarang memilih istilah m dari M secara seragam secara acak, huruf L n kita dipilih dengan probabilitas (2n + 1) / 26/26 = (2n + 1) / 676 .
Ini menghasilkan distribusi probabilitas berikut.
Anda dapat secara empiris memverifikasi distribusi dengan menelepon tautan 100.000 kali (butuh beberapa detik).
sumber
MATL , 10 byte
Cobalah online!
Kode menghasilkan variabel acak seragam pada interval (0,1) (
r
) dan menghitung kuadratnya (U
). Ini menghasilkan kepadatan probabilitas yang tidak seragam dan menurun. Mengalikan dengan 26 (26*
) memastikan bahwa hasilnya ada pada interval (0,26), dan pembulatan ke bawah (k
) menghasilkan nilai 0,1, ..., 25 dengan penurunan probabilitas. Nilai ini digunakan sebagai indeks ()
) ke dalam huruf besar (1Y2
). Karena MATL menggunakan pengindeksan modular berbasis 1, 0 berkorespondensi dengan Z, 1 ke A, 2 ke B dll.Sebagai ilustrasi bahwa probabilitasnya berbeda, inilah histogram diskrit yang dihasilkan dari 10.00000 realisasi acak. Grafik diproduksi dengan menjalankan ini di Matlab:
sumber
k
! Memperhatikan hal itu ketikaJava 7,
625756 byte5 byte berkat Poke.
1 byte berkat trichoplax.
Ide itu!
Diagram frekuensi (berjalan 1e6, faktor penskalaan 1/1000)
sumber
sqrt(x*y*y) = sqrt(x)*y
Perl, 24 byte
-4 byte terima kasih kepada @Martin Ender
-1 byte terima kasih kepada @Dom Hastings
Perlu
-M5.010
atau-E
untuk dijalankan:Menjalankan kode berikut akan menunjukkan kemunculan setiap huruf:
Cara kerjanya : Saya kira kode ini cukup eksplisit, tetapi tetap: ia memilih nomor acak antara
0
danrand 26
. Jadi ada kemungkinan yang jauh lebih tinggi bahwa angka yang dekat dengan0
(hurufA
) dipilih.sumber
say+(A..Z)[rand rand 26]
(A..Z)[...]
dan tidak berhasil, jadi saya pikir saya bisa menggunakan array anonim seperti itu, tapi itu hanya karenasay
.. terima kasih! :)PHP,
44362927 byteDicoret 44 masih teratur 44; (
Terima kasih untuk menyisipkan nama pengguna di sini, Petah, dan Crypto untuk semua bantuannya
Ia memilih angka acak antara 0 dan 675 (= 26 2 -1), mengambil akar kuadratnya, dan menempatkannya (
chr
fungsi mengubah argumennya menjadi bilangan bulat). Karena kuadrat memiliki interval yang berbeda di antara mereka, probabilitas setiap nomor yang dipilih berbeda. Setiap n dipilih dengan probabilitas (2n + 1) / 676.Menambahkan 65 ke nomor ini memberi Anda karakter acak dari
A
hinggaZ
.Gagasan kode dijalankan 1.000.000 kali
sumber
range(A,Z)
.chr()
.<s> 44 </s>
<?=chr(65+sqrt(rand(0,675)));
R,
4027 byteIni akan mengambil
1
angka dari26
angka-angka yang dihasilkan dengan probabilitas yang semakin besar menujuZ
, tanpa mengganti, dan menampilkan huruf yang indeksnya adalah angka ini, dari daftar huruf besarLETTERS
.Argumen
sample
fungsi adalah:sumber
> <> , 14 byte
> <> adalah bahasa 2D toroidal, dan bagian probabilitas yang berbeda secara alami terjadi karena satu-satunya sumber keacakan dari bahasa tersebut. Cobalah online!
Perintah yang relevan adalah:
Dengan demikian probabilitas output adalah:
sumber
Python 2,
5857 bytePenjelasan: ini menghasilkan angka floating point acak dalam interval
[0, 676)
, mengambil akar kuadrat dan kemudian lantai itu. Kemudian ia menambahkan 65 (nilai ascii dari "A"), mengubahnya menjadi char, dan mencetaknya.Ini memberikan setiap angka dari 0 hingga 25 probabilitas yang berbeda. Untuk memahami mengapa, pikirkan seperti ini. Berapa banyak angka, mengabaikan non-bilangan bulat, ketika Anda mengambil akar kuadrat dan lantai memberi 0? Hanya satu angka yang akan (nol). Ini berarti nol memiliki probabilitas
1/676
. Berapa angka yang akan menghasilkan 1? 3 akan, 1, 2, dan 3. Ini berarti seseorang memiliki probabilitas3/676
. Dua dapat diproduksi dengan 4, 5, 6, 7, atau 8, memberikan probabilitas 5, tiga memiliki probabilitas 7, dll. Dan karena perbedaan antara kuadrat berurutan meningkat terus dengan dua, pola ini berlanjut untuk setiap angka ke atas hingga 25 (Z).1 byte disimpan berkat biarawati bocor!
sumber
chr(int(65+randint(676)**.5))
chr(int(65+random()**.5*26))
. Hal yang sama secara aljabar karena 26 == √676. dan sekarang urutan operasi ada di pihak Anda**2*26
dapat digunakan untuk distribusi terbalik.1/random()%26
juga harus bekerja.PowerShell v2 +,
3331 byteMengambil rentang dari
65
ke90
(yaitu, ASCIIA
keZ
), menyalurkannya melalui loop. Setiap iterasi, kami menggunakan operator koma untuk membuat larik elemen tersebut dikali angka tersebut. Sebagai contoh, ini akan menghasilkan 6565
s, 6666
s, 6767
s, dll. Array besar itu disalurkan keGet-Random
mana (secara seragam PRNG) akan memilih satu elemen. Karena ada jumlah yang berbeda dari setiap elemen, setiap karakter memiliki peluang persentase yang sedikit berbeda untuk dipilih. Kami kemudian merangkum bahwa dalam parens dan melemparkannya sebagaichar
. Yang tersisa pada pipa dan output tersirat.(Terima kasih kepada @LeakyNun untuk bermain golf beberapa byte bahkan sebelum diposting.: D)
Peluangnya
(sedikit pembulatan sehingga saya bisa menunjukkan
P
opsi dari-f
operator ormat)sumber
gal
keluaran ([char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random
) mencapai 50 karakter, kemudian 48, beralih ke angka dan mendapat 42, kemudian 31 dan berhenti di sana; memandang ke papan peringkat untuk melihat di mana itu akan menempatkan saya. Disini. Karakter untuk karakter identik. Nah, saya mungkin tidak bisa mengalahkan itu.CJam,
211712 byteTerima kasih kepada Martin Ender karena telah menyelamatkan saya 5 byte!
Versi baru
Ini membentuk sebuah array dari string mengikuti pola
A
,AB
,ABC
, dan sebagainya. Ini mendatar dan memilih karakter acak. Karena string ini mengandung 26 A, 25 B, 24 C, dan seterusnya, setiap huruf memiliki kemungkinan berbeda untuk dipilih.Cobalah online!
Penjelasan
Versi lama
Mendapat probabilitas berbeda dengan membuat string di mana setiap huruf muncul beberapa kali sama dengan posisinya dalam alfabet.
sumber
R, 23 byte
Hanya 'sampel' surat dari builtin. yang
1:26
merupakan vektor bobot memberikan setiap huruf probabilitas yang berbeda.sumber
1:26
adalah vektor bobot untuk setiap hurufC, 35 byte
Program ini mengasumsikan
RAND_MAX
adalah (2 ^ 32/2) - 1 karena pada gcc secara default. Kompilasi dengan-lm
bendera untuk menautkansqrt
fungsi. Output ditulis ke stdout sebagai huruf kapital tanpa tertinggal baris baru.Secara opsional, jika
RAND_MAX
(2 ^ 16/2) - 1, versi 32 byte yang lebih pendek dapat digunakan:Hanya untuk bersenang-senang, saya juga membuat versi yang tidak menggunakan
sqrt
fungsi atau memerlukan perpustakaan matematika yang disertakan (yang ini harus memilikiRAND_MAX
(2 ^ 32/2) - 1), tetapi akhirnya menjadi lebih lama meskipun saya pikir itu adalah cukup keren:Penjelasan
[Program Pertama]
Untuk dua yang pertama menggunakan
sqrt
, fungsi hanya peta kisaran[0, RAND_MAX)
untuk[0, 25]
melalui divisi, dan kemudian menambahkan 65 (ASCIIA
) untuk nilai bergeser ke dalam alfabet ASCII sebelum keluaran itu.[Program Kedua]
Program kedua sedikit lebih rumit karena melakukan strategi yang sama, tetapi tanpa
sqrt
operator. Karena bit eksponen floating point dihitung secara otomatis setelah menetapkan bilangan bulat, mereka dapat secara efektif digunakan sebagai cara kasar untuk mendapatkan logaritma basis 2 dari angka.Karena kita hanya ingin rentang hingga
RAND_MAX
mencapai nilai eksponen yang dikodekan dari 25, perhitungan (2 ^ 32/2 - 1) / (2 ^ 25) memberi kita hanya sekitar 64, yang digunakan selama pembagianrand
untuk memetakannya ke rentang baru ini. Saya juga menambahkan 1 ke nilai karena representasi floating point 0 agak aneh dan akan merusak algoritma ini.Selanjutnya, float diketik dengan tipe integer untuk memungkinkan bithifting dan operasi lainnya. Karena dalam angka floating point IEEE 754 bit eksponen adalah bit 30-23, angka tersebut kemudian bergeser ke kanan 23 bit, memotong mantissa dan membiarkan nilai eksponen mentah dibaca sebagai integer. Perhatikan bahwa bit tanda juga di luar bit eksponen, tetapi karena tidak pernah ada negatif itu tidak harus ditutup.
Daripada menambahkan 65 ke hasil ini seperti yang kami lakukan sebelumnya, eksponen floating point direpresentasikan sebagai integer 8 bit yang tidak ditandatangani dari 0 hingga 255, di mana nilai eksponen 0 adalah 127 (Cukup kurangi 127 untuk mendapatkan nilai eksponen "ditandatangani" yang sebenarnya ). Karena 127 - 65 adalah 62, kami hanya mengurangi 62 untuk menggesernya keluar dari rentang eksponen titik mengambang ini dan ke dalam rentang alfabet ASCII semuanya dalam satu operasi.
Distribusi
Saya bukan ahli matematika jadi saya tidak bisa mengatakan dengan pasti rumus yang tepat untuk distribusi ini, tetapi saya dapat (dan memang) menguji setiap nilai pada rentang
[0, RAND_MAX)
untuk menunjukkan bahwa jarak antara di mana rentang satu huruf berakhir dan yang lainnya dimulai tidak pernah menjadi sama. (Perhatikan tes ini menganggap (2 ^ 32/2) - 1) maksimum acak)[Program Pertama]
[Program Kedua]
sumber
char
merupakan tipe integral dalam C, itu harus dapat diterima.Python 2, 72 byte
Mengalikan karakter dengan nilai ascii-nya, lalu mengambil satu karakter secara acak dari string yang dihasilkan.
Berikut adalah probabilitas untuk setiap huruf yang dipilih, dalam persentase:
Cobalah: https://repl.it/Cm0x
sumber
Jelly , 5 byte
(Skor yang sama, tetapi metode yang berbeda , untuk solusi Jelly yang ada oleh Dennis.)
Peluang menghasilkan setiap huruf adalah indeks berbasis-1 dalam alfabet dibagi dengan 351 - angka segitiga ke-26:
A
) = 1/351, P (B
) = 2/351, ..., P (Z
) = 26/351.Karena 1 + 2 + ... + 26 = 351, P (huruf) = 1.
Penerapan:
Uji di TryItOnline atau dapatkan distribusi 100 ribu berjalan (kode kredit ke Dennis)
sumber
q, 38 byte
Tidak terlalu pendek tapi ...
Fungsi distribusi kumulatif diskrit adalah urutannya
0.9 ^ 26, 0.9 ^ 25, ..., 0.9 ^ 0
Dan kami hanya mengambil sampel dari distribusi.
sumber
JavaScript (ES6), 45 byte
Mencapai distribusi tidak seragam dengan mengkuadratkan nilai acak.
Math.random()
mengembalikan float dari rentang[0,1)
sehingga hasil kuadrat ini cenderung ke arah0
(ataua
).Uji
Tampilkan cuplikan kode
sumber
(n=Math.random(),10+26*n+n|0).toString(36)
Oracle SQL 11.2, 212 byte
Menggunakan posisi karakter dalam alfabet sebagai probabilitas
Tidak bermain golf
sumber
TI-Basic, 39 byte
rand
menghasilkan nilai seragam dalam (0,1) .Ini memberikan 26 ^ rand probabilitas yang berbeda untuk sama dengan bilangan bulat dari 1 hingga 26.Versi yang lebih lama, 45 byte
Ketepatan terbatas dari bilangan bulat TI-Basic membatasi distribusi normal untuk menghasilkan angka dalam μ ± 7.02σ (lihat
randNorm(
). Jadi kita mendapatkan nilai absolut dari angka acak dengan μ 0 dan σ 1, dikalikan empat untuk meningkatkan rentang praktis yang disebutkan sebelumnya menjadi μ ± 28.08σ. Kemudian, kami memberi nilai dan menambahkan 1, karenasub(
1-diindeks, memberi kami kisaran 1-29 dengan probabilitas masing-masing yang berbeda.sumber
PHP,
9284 byteBuat string dari semua huruf, ulangi berapa kali melalui loop kita, dan kemudian ambil surat dari string itu secara acak. Surat-surat kemudian dalam alfabet memiliki probabilitas yang lebih tinggi sebagai hasilnya
Terima kasih untuk menyisipkan nama pengguna di sini untuk memotong byte
probabilitas hasil (dipesan oleh%)
sumber
$x=0
yang jelas diperlukan. Berikut adalah versi 84 byte :for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1);
Apakah Anda pernah berhasil mendapatkan nilai lebih besar daripadaG
saat menjalankan kode Anda? Lagi pula, Anda selalu dapat mengabaikannotice
saat bermain golf.strlen
of$a
adalah 351, tetapi Anda hanya memilih karakter acak dari yang pertama$x
(26) karakter. Anda dapat memperbaikinya dan menjaga probabilitas Anda dengan perubahan final$x
menjadi350
+1 byte. Berikut adalah versi 77 byte yang memperbaiki masalah tetapi juga membawa probabilitas lebih dekat:for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);
Befunge,
168164 byteLebih ringkas daripada yang pertama, dengan probabilitas yang sedikit berbeda: Yang pertama
?
memiliki peluang 1/4 untuk mencetak nilai A pada "percobaan pertama", peluang 2/4 untuk kembali ke yang sama?
, dan 1/4 untuk pindah ke lanjut. Sisanya?
masing-masing memiliki 1/4 peluang untuk mencetak surat di bawahnya, 1/4 untuk mencoba lagi, 1/4 pindah ke surat berikutnya, 1/4 pindah ke yang sebelumnya. Sekali lagi, probabilitas mencetak huruf A jauh lebih tinggi daripada mencetak huruf Z.Befunge, 186 byte
Jelas tidak akan menang dengan ini, tapi saya pikir ini adalah jawaban yang menarik :)
v
dan>
mengarahkan kursor masing-masing ke bawah dan ke kanan. The?
Operator mengirimkan kursor off di salah satu dari empat arah secara acak. Yang pertama?
"diblokir" olehv
dan>
dalam dua arah, sehingga hanya memiliki dua cara untuk pergi: Baik untuk mencetak A, atau turun ke yang berikutnya?
. Jadi, dari yang pertama?
saja ada kemungkinan 50% untuk mencetak A.Yang berikutnya
?
memiliki peluang 1/3 untuk mencetak B, 1/3 untuk kembali ke atas, dan 1/3 untuk lebih jauh ke bawah. Dll.Seharusnya cukup jelas bahwa huruf-huruf yang lebih tinggi memiliki peluang lebih besar untuk dicetak daripada huruf-huruf yang lebih rendah, tetapi saya tidak begitu yakin dengan peluang masing-masing huruf.
Beberapa bantuan dengan matematika pasti akan dihargai :)
Setidaknya ada peluang 1/2 * 1/3 ^ 25 bahwa kursor bergerak ke Z pada percobaan pertama, tapi saya tidak yakin bagaimana peluang kursor bergerak ke atas dan ke bawah memengaruhi setiap huruf.
,@
cetakan dan berhenti.sumber
J,
2018 bytePenerjemah online
Huruf besar.
Probabilitas setiap huruf adalah indeks berbasis 1 dalam alfabet.
sumber
zsh, 63 byte
ini bekerja dengan membuat string ini:
alias 65 kali A, 66 kali B, 67 kali ...
dan kemudian memilih karakter acak di dalamnya
sumber
A
di ascii. Anda bisa mulai dari 1, tetapi kemudian loop batin menjadi{65..$[#i]}
yang 1 char lagiCJam, 11 byte
atau
Cobalah online!
Solusi ini mirip dengan ide Luis dan menciptakan distribusi yang tidak seragam dengan mengambil akar kuadrat dari variabel acak.
sumber
Batch, 116 byte
Bekerja dengan memilih yang lebih besar atau lebih kecil (saya lupa yang mana) dari dua variabel acak.
sumber
Matlab, 22
Akan sering mengembalikan surat awal, tetapi secara teoritis dapat menyentuh semuanya!
Membawa satu yang dibagi dengan angka acak, membatasi ini hingga 26 dan mengubahnya menjadi karakter.
Tentu saja tidak terlalu singkat, tetapi mungkin konsepnya dapat menginspirasi jawaban lain.
sumber
rand
mengembalikan nilai dalam [0, 1)? Yaitu, termasuk nol tetapi tidak termasuk satu. Jika ini sesekali menghasilkan 1/0, apakahmin(1/0,26)
masih akan mengembalikan 26, atau kesalahan?rand
mengembalikan nilai dalam (0,1), jadi seharusnya tidak ada masalahrand
kembali 0 dalam praktek,min(1/0,26)
sebenarnya mengembalikan 26.CJam, 10 byte
Pendekatan CJam # 3 ...
Cobalah online!
Ini membuat angka acak seragam
x
antara 1 dan 26 dan kemudian menggunakannya untuk membuat angka acak seragam antara0
danx-1
yang ditambahkanA
. Bias ini menghasilkan karakter yang lebih kecil.sumber
Labirin , 19 byte
Cobalah online!
Ini adalah loop yang, pada setiap iterasi, baik a) menambah penghitung yang dimulai dari nol atau b) berakhir, keduanya dengan probabilitas 50%. Pada akhir loop, penghitung diambil modulo 26 dan ditambahkan ke 65 untuk memberikan surat antara
A
danZ
.Ini memberikan kemungkinan
A
hanya sedikit di atas 50%,B
hanya sedikit di atas 25% dan seterusnya hinggaZ
hanya sedikit di atas 1/2 26 . Secara teori, ada kemungkinan ini berjalan selamanya, tetapi acara ini memiliki probabilitas nol seperti yang dipersyaratkan oleh tantangan (dalam praktiknya itu mungkin tidak mungkin karena PRNG akan mengembalikan kedua hasil yang mungkin di beberapa titik selama periode tersebut).sumber