Terinspirasi oleh Alex yang mulia. Pelajari Anda R untuk kebaikan besar, kita akan dengan rendah hati menciptakan kembali "satu program R yang benar" Alex - tetapi dengan twist.
Alex-style Addition bekerja seperti ini - ia memiliki peluang 90% untuk hanya mengembalikan jumlah dari dua angka yang diberikan dan peluang 10% untuk Alex secara rekursif menambahkan angka pertama dan angka kedua + 1. Ini berarti bahwa, berpotensi , tambahan bisa dimatikan oleh 1 atau lebih.
Tantangan
Tulis program atau fungsi lengkap yang membutuhkan dua bilangan bulat dan Alex-menambahkannya sesuai definisi. Anda dapat berasumsi bahwa program Anda tidak akan menumpuk overflow jika bahasa Anda tidak memiliki rekursi ekor. (Perhatikan bahwa Anda tidak harus mengimplementasikannya secara rekursif, asalkan probabilitasnya sama.)
Implementasi Referensi (Groovy)
int alexAdd(int a, int b) {
int i = new Random().nextInt(11);
if(i == 1) {
return alexAdd(a,b+1);
} else {
return a + b;
}
}
Papan peringkat
var QUESTION_ID=66522,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
sumber
Jawaban:
Pyth, 8
Cobalah online
Ini menggunakan mode kedua Pyth pada pengurangan, yang mencari input berulang kemudian keluar.
Penjelasan
Jika tambahan alex-add terjadi itu akan berjalan lagi, tetapi jika tidak maka itu keluar.
sumber
Python 2, 55 byte
Ini adalah cara yang sangat aneh untuk melakukannya.
Fungsi
random
memberikan float dalam [0,1), dan representasi string secara default memiliki 16 digit setelah titik desimal, untuk total 18 karakter. Tapi, karena trailing 0 dihilangkan, mungkin lebih pendek. Membaca angka dari akhir, masing-masing memiliki peluang 1/10 menjadi 0, dan kita berhenti ketika kita menekan angka yang bukan nol. Jadi jumlah nol trailing didistribusikan seperti jumlah rekursi yang dibuat Alex, jadi kita dapat sampel dari distribusi ini sebesar 18 dikurangi panjang string.Sebenarnya, Python akan menampilkan lebih dari 18 digit untuk angka kecil, terkadang bahkan notasi ilmiah, jadi kami menambahkan 1 untuk memperbaikinya.
Ini tidak akan pernah memberikan lebih dari 15 lebih dari jumlah, tetapi tidak apa-apa karena 10 ^ 15 jauh lebih kecil daripada peluang sinar kosmik mengganggu perhitungan .
sumber
R,
604728 byteIni adalah objek fungsi yang tidak disebutkan namanya yang menerima dua angka dan mengembalikan angka. Itu tidak menggunakan rekursi.
Seperti yang ditunjukkan xnor dalam komentar, masalah ini dapat dilihat hanya dengan menambahkan dua angka ditambah variabel acak geometris dengan probabilitas kegagalan 1/10.
Mengapa itu benar? Pikirkan tentang hal ini dalam hal rekursi, seperti yang dijelaskan dalam posting. Dalam setiap iterasi, kami memiliki peluang 10% untuk menambahkan 1 dan berulang, dan 90% peluang untuk keluar dari fungsi tanpa penambahan lebih lanjut. Setiap iterasi adalah percobaan Bernoulli independennya sendiri dengan hasil "tambah 1, berulang" (gagal) dan "keluar" (sukses). Dengan demikian probabilitas kegagalan adalah 1/10 dan probabilitas keberhasilan adalah 9/10.
Ketika berhadapan dengan serangkaian uji coba Bernoulli independen, jumlah uji coba yang diperlukan untuk memperoleh kesuksesan tunggal mengikuti distribusi geometris . Dalam kasus kami, setiap rekursi berarti menambahkan 1, jadi ketika kami akhirnya keluar dari fungsi, kami telah menghitung jumlah kegagalan yang terjadi sebelum kesuksesan pertama. Itu berarti bahwa jumlah yang hasilnya akan dimatikan adalah variasi acak dari distribusi geometrik.
Di sini kita dapat mengambil keuntungan dari rangkaian ekspansif R dari distribusi probabilitas built-in dan penggunaan
rgeom
, yang mengembalikan nilai acak dari distribusi geometrik.Tidak Disatukan:
sumber
Minkolang 0,14 ,
191112 byteIni adalah versi "fungsi"; mengasumsikan
a
danb
sudah ada di stack, muncul dan dorong versi modifikasi daria+b
. Setara dengan fungsi di Minkolang adalah menggunakanF
, yang munculb
,a
dan melompat ke(a,b)
dalam kotak kode. Kemudian ketika penghitung program mengenaif
, itu melompat kembali ke tempatF
digunakan.Ini adalah versi program lengkap, 15 byte . (
nn
mengambil dua angka dari input danN.
output hasilnya dan berhenti.)Saya mencuri algoritme dari jawaban Doorknob ; loop sementara berulang selama nomor acak yang dihasilkan kurang dari 0,1, menambahkan 1 setiap kali. Coba di sini (versi program lengkap) dan jalankan 100 kali di sini .
Penjelasan
Bagian paling pintar di sini adalah
d
. Bagian atas tumpukan pada titik waktu tersebut adalah 0 atau 1. Jika 0, loop sementara keluar. Kalau tidak, itu berlanjut. Ketika saya menduplikasi bagian atas tumpukan, itu akan menjadi[a+b,1]
yang kedua kalinya melalui loop, sehingga+
pada awalnya menambahkan 1 (dan juga untuk perjalanan selanjutnya).sumber
f
pada akhirnya dalam hitungan char (dan secara teknis baris baru sebelumnya jika Anda merasa luar biasa, tapi saya pikir itu tidak perlu).CJam,
1211 byteTerima kasih kepada @ MartinBütter karena telah menghemat satu byte dengan trik super pintar ini!
Jawaban lama:
Cobalah online .
Penjelasan:
Algoritme dasar adalah "while (peluang 0,1), menambah angka," yang menghilangkan kebutuhan untuk rekursi.
sumber
Javascript ES6, 38 byte
sumber
f=(a,b)=>new Date%10<1?f(a,b+1):a+b
untuk 35 byteDate
timestamp tidak akan akurat karena jika dievaluasitrue
akan terus menambahkan1
selama sisa milidetik.f=(a,b)=>a+b-~~Math.log10(Math.random())
tetapi 2 byte lebih lama.MATL ,
141312 byteIni hanya metode loop, tambahkan input (dimasukkan sebagai
[a b]
) kemudian terus menambahkan satu sedangkan angka acak seragam antara 0 dan 1 kurang dari 0,1. Deskripsi lengkap di bawah ini:Lepas 1 byte dengan mengubah spesifikasi input (dari
ii+
menjadiis
).Cara lama didasarkan pada mengambil basis-10 log dari angka acak antara 0 dan 1 untuk menghitung jumlah yang akan ditambahkan
a+b
, namun itu hanya akan bekerja hingga 15 pengulangan karena akurasi floating point.Dalam kode ini,
10,2$YlZo-
apakah basis-10 logaritma dari angka acak dan dibulatkan ke bilangan bulat terdekat.sumber
ii+`10Yr1=tb+w]
:, belum golf.Binary-Encoded Golfical ,
3229 +1 (-x
flag) = 30 byteHexdump (diedit secara manual untuk mengoreksi bug di bagian image-to-binary dari transpiler, yang telah diperbaiki):
Pengkodean ini dapat dikonversi kembali ke representasi grafis asli menggunakan utilitas Encoder yang disertakan, atau dijalankan langsung menggunakan
-x
flag.Gambar asli:
50x diperbesar:
Penjelasan: Baris atas adalah blok utama. Itu membaca angka, menyalinnya ke kanan, membaca nomor lain, menambahkannya, menyalin hasilnya ke kanan, melakukan beberapa hal RNG, dan, dengan probabilitas 90%, mencetak hasil penambahan. Sisa waktu, dikirim ke baris bawah, di mana ia menempatkan satu di sel pertama dan kembali ke baris utama tepat sebelum instruksi tambahan (menggunakan belokan utara lalu belokan timur).
sumber
Python,
66656463 byteCobalah online
Terima kasih kepada Sherlock9 untuk koreksi dan byte yang disimpan.
Terima kasih kepada Mathias Ettinger untuk byte lainnya.
Berkat mbomb007 untuk satu byte.
sumber
.9>random()
tidak cukup 9-dari-10, karena distribusi float yang tidak merataJulia, 30 byte
Ini adalah fungsi rekursif
f
yang menerima dua angka dan mengembalikan nomor dengan tipe yang sama. Seharusnya berfungsi dengan baik untuk semua jenis numerik.Pertama kita periksa apakah float acak antara 0 dan 1 lebih besar dari 0,9. Jika demikian, kita kambuh dengan sedikit tambahan 'sesuatu', kalau tidak kita tambahkan saja.
sumber
TI-BASIC, 15 byte
Ini mengambil input dari daftar dua elemen
Ans
. Meskipun angka acak kurang dari0.1
, itu menambahkan vektor0.5
dalam daftar. Meningkatkan setiap elemen dengan0.5
menambah jumlah dengan 1. Saya percaya ini adalah solusi TI-BASIC terpendek.Program 9-byte
sum(Ans)-int(log(10rand
tidak berfungsi, karenarand
hanya memiliki 14 digit presisi, dan karenanya tidak dapat memberikan angka kurang dari 10 -14 .sumber
APL, 17 byte
Ini adalah fungsi diad yang tidak disebutkan namanya.
Tidak Disatukan:
sumber
Pyth,
1412 byteGolf Pyth asli pertamaku!
Mengambil input pada STDIN dalam format
a,b
.Penjelasan:
Terima kasih kepada @FryAmTheEggman karena telah mengurangi dua karakter dengan memberi saya cara yang lebih singkat untuk meningkatkan variabel!
sumber
Vitsy ,
1210 byteCobalah online!
Perhatikan bahwa ini memiliki kemungkinan kecil kesalahan stack overflow. Kami sedang berbicara tentang
(.1)^400
kesempatan. Itu juga keluar karena kesalahan karena bagaimana saya menyebabkan rekursi.sumber
Lisp, 58 byte
Pertama kali saya menulis Lisp!
Anda dapat menggunakan tambahan khusus ini persis seperti yang biasanya Anda tambahkan di Lisp:
Saya akan senang mendengar saran karena saya baru mengenal bahasa ini.
sumber
(- a(- -1 b))
bekerja Menghemat 2 byte jika berhasil.Serius, 10 byte
Program ini menghasilkan variabel acak dari distribusi geometrik dengan mengubah distribusi yang seragam. Dibutuhkan input sebagai daftar:
[2,3]
(kawat gigi opsional). Cobalah online .Penjelasan:
Diberikan variabel acak
X ~ Uniform(0, 1)
, itu dapat ditransformasikan menjadi variabel acakY ~ Geometric(p)
dengan rumusY = floor(log(X)/log(p))
.sumber
Mathematica, 32 byte
Penjelasan:
Perhatikan bahwa fungsi ini berfungsi untuk sejumlah input.
sumber
TeaScript , 18 byte
21Ini adalah fungsi TeaScript. Tetapkan ke variabel atau jalankan langsung.
Cobalah online
sumber
Permen , 11 byte
Bentuk panjangnya adalah:
sumber
C,
71513937 byteGolf kode pertama, dilakukan di C. Saya tidak berpikir itu akan mengalahkan apa pun, dan mungkin banyak golf
EDIT 3: memotong 2 byte berkat @Mego, dengan menulis 0,1 bukannya 0,1 dan menulis ulang operator ternary
EDIT 2: memotong 12 byte, mengikuti gnu99, setiap variabel adalah int jika tidak dinyatakan sebaliknya. Hal yang sama berlaku untuk jenis fungsi kembali
EDIT: memotong 20 byte, lupa bahwa .h dasar tidak diperlukan dalam C99 (menggunakan gcc misalnya). Ini akan menghasilkan peringatan :)
Solusi 71 Bytes:
Jika Anda ingin melihat banyak output, Anda dapat menggunakan kode berikut
sumber
MATL , 12
1314byteInput berupa formulir
[3 4]
, yaitu, vektor baris dengan dua angka.Contoh
Penjelasan
Ini menghasilkan variabel acak geometris tanpa loop, dengan secara langsung menerapkan transformasi a ke variabel acak seragam. Perhatikan bahwa log 0,1 a digunakan sebagai ganti log a / log 0,1 untuk menghemat 1 byte.
sumber
Microscript ,
2921 byteSaya mencoba membuat jawaban Microscript II tetapi karena beberapa alasan saya tidak bisa mendapatkan loop tambahan berfungsi dengan benar :(
sumber
Mouse-2002 ,
413938 byteTidak ada rekursi.
Dijelaskan:
Atau, jika Anda penggemar pemrograman fungsional, dan rekursi adalah kesepakatan Anda, maka 57 byte :
Dijelaskan:
sumber
Jelly , 7 byte (tidak bersaing)
Cobalah online!
Bagaimana itu bekerja
sumber
APL (Dyalog Unicode) ,
1312 byte SBCSPada dasarnya sama dengan solusi Pyth FryAmTheEggman . -1 terima kasih kepada Erik the Outgolfer.
Fungsi infiks diam-diam anonim.
Cobalah online!
+
tambahkan argumen{
...}⍣=
terapkan fungsi berikut sampai dua aplikasi berturut-turut memiliki hasil yang sama:?10
bilangan bulat acak dalam kisaran 1–101=
Apakah sama dengan itu? (yaitu 1 / 10 th kesempatan)⍵+
tambahkan argumen itusumber
/
.Perl 6 , 26 byte
Sebenarnya melakukannya secara rekursif:
Buat urutan
1
s yang mungkin kosong diikuti oleh argumen, lalu jumlahkan semuanya.(Ini benar-benar dapat mengambil sejumlah argumen)
pemakaian:
sumber
Pyth, 11 byte
Port Pyth langsung dari jawaban Python saya .
sumber
Oktaf, 20 byte
Jumlah input, ditambah sampel acak dari distribusi geometrik dengan parameter
0.9
.sumber
Serius, 13 byte
Menggunakan strategi yang mirip dengan jawaban CJam Doorknob (angka kenaikan sementara float acak kurang dari 0,1), kecuali menggunakan bilangan bulat, dan penambahan sementara bilangan bulat acak
[0,9]
kurang dari 1. Kurangnya rekursi mudah menyakitkan.Cobalah online (perlu input manual)
Penjelasan:
Loop sementara meninggalkan tumpukan seperti ini:
Bergeser ke
n
atas dengan 1 diperlukan untuk menjalankan loop sementara, karena0
ini adalah falsey. Ini mudah ditangani dengan mengurangin
setelah loop sementara, jadi hasil akhirnya adalaha + b + (n - 1)
.sumber
MATLAB, 51 byte
Hasilnya ditemukan dalam variabel otomatis 'ans'
sumber