Tambahan Gaya Alex


57

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;
  }
}

Coba biola ini secara online.

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>


6
Jadi itu memberikan jumlah dua angka ditambah variabel acak geometris dengan probabilitas kegagalan 1/10?
xnor

@ xnor Pada dasarnya, ya. Saya mendefinisikannya secara rekursif sehingga lebih mudah untuk dipahami, tetapi Anda tidak harus melakukannya secara rekursif (solusi CJam tidak, misalnya)
spaghetto

10
Mengapa kotak pasir ini selama 20 menit? Tampaknya itu kehilangan titik kotak pasir.
Peter Taylor

3
@PeterTaylor Satu masalah kecil dengan itu diperbaiki segera, dan pertanyaannya sangat sederhana saya tidak berpikir itu perlu untuk tinggal di kotak pasir selama itu (sudah dilihat oleh 10 orang yang saya pikir sudah cukup teman sebaya mengulas tantangan yang sangat sederhana). Alasan utama saya memilikinya di kotak pasir adalah untuk melihat apakah orang berpikir itu terlalu sederhana.
spaghetto

2
Saya akan mengatakan itu masih memiliki masalah besar, dalam hal itu tidak jelas apakah Anda bersikeras implementasi ditulis sebagai fungsi rekursif atau hanya pada memberikan distribusi yang tepat, tetapi sudah terlalu terlambat untuk melakukan apa pun tentang klarifikasi itu sekarang.
Peter Taylor

Jawaban:


40

Pyth, 8

u+G!OTsQ

Cobalah online

Ini menggunakan mode kedua Pyth pada pengurangan, yang mencari input berulang kemudian keluar.

Penjelasan

u+G!OTsQ  ##  Implicit: Q=eval(input())
u     sQ  ##  reduce with 2 arguments, which causes a loop until the reduce gets the
          ##  same argument twice
 +G       ##  lambda G,H: G + ...
   !OT    ##  boolean not of random value from 0 to 9 inclusive

Jika tambahan alex-add terjadi itu akan berjalan lagi, tetapi jika tidak maka itu keluar.


13
Ini ... adalah sihir hitam murni. O_o
Gagang Pintu

1
Ini konyol.
kucing

36

Python 2, 55 byte

from random import*
lambda a,b:a+b+18-len(`1+random()`)

Ini adalah cara yang sangat aneh untuk melakukannya.

Fungsi randommemberikan 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 .


1
Maaf, jawaban ini tidak valid, karena memiliki peluang 10 ^ -15 untuk tidak berfungsi dengan baik , yang secara eksplisit dilarang oleh meta post yang ditautkan.
pppery

22

R, 60 47 28 byte

function(a,b)a+b+rgeom(1,.9)

Ini 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:

f <- function(a, b) {
    a + b + rgeom(n = 1, prob = 0.9)
}

13

Minkolang 0,14 , 19 11 12 byte

Ini adalah versi "fungsi"; mengasumsikan adan bsudah ada di stack, muncul dan dorong versi modifikasi dari a+b. Setara dengan fungsi di Minkolang adalah menggunakan F, yang muncul b, adan melompat ke (a,b)dalam kotak kode. Kemudian ketika penghitung program mengenai f, itu melompat kembali ke tempat Fdigunakan.

(+$01$h`d)xf

Ini adalah versi program lengkap, 15 byte . ( nnmengambil dua angka dari input dan N.output hasilnya dan berhenti.)

nn(+$01$h`d)xN.

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

(              Open a while loop
 +             Adds the top two items of the stack
  $0           Pushes 0.1
    1$h        Pushes a random number between 0.0 and 1.0, inclusive
       `       Pops b,a and pushes a > b
        d      Duplicate the top of stack
         )     Close the while loop when the top of stack is 0
          x    Dump the extra, leading 0

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).


Apakah ini benar-benar fungsi? Saya dengan cepat memindai melalui dokumentasi bahasa, dan tidak dapat menemukan apa pun yang menggambarkan definisi fungsi. Berdasarkan penjelasan, lebih mirip fragmen kode.
Reto Koradi

@RetoKoradi: Saya bisa meletakkan "fragmen kode" di barisnya sendiri, lompat ke sana dengan 0kF (di mana k adalah angka), dan lompat kembali dengan f di akhir. Itu yang terdekat dengan fungsi di Minkolang.
El'endia Starman

2
Bukankah itu secara teknis seperti mengatakan "fragmen kode CJam saya adalah fungsi; Anda hanya perlu mengelilinginya dengan kurung kurawal"? Paling tidak, Anda mungkin harus memasukkan fpada akhirnya dalam hitungan char (dan secara teknis baris baru sebelumnya jika Anda merasa luar biasa, tapi saya pikir itu tidak perlu).
Gagang Pintu

1
Jika bahasa tidak memiliki fungsi, Anda selalu dapat memposting program lengkap. Pemahaman saya adalah bahwa ketika ia mengatakan "fungsi", itu harus berupa fungsi bernama, atau fungsi anonim (yang biasanya merupakan ekspresi yang dapat ditugaskan ke variabel fungsi). Saya pernah memposting sesuatu yang mirip dengan ini di CJam, dan Martin dengan cepat memanggil saya keluar, mengatakan bahwa itu adalah fragmen kode, dan bukan fungsi.
Reto Koradi

@RetoKoradi: Baiklah, itu bisa dimengerti. Apa pendapat Anda tentang saran Doorknob?
El'endia Starman

12

CJam, 12 11 byte

{{+Amr!}h;}

Terima kasih kepada @ MartinBütter karena telah menghemat satu byte dengan trik super pintar ini!

{         }
 {     }h    Do-while that leaves the condition on the stack.
  +          Add: this will add the numbers on the first iteration...
   Amr!      ... but a `1` (i.e. increment) on future ones.
         ;   Pop the remaining 0.

Jawaban lama:

{+({)Amr!}g}

Cobalah online .

Penjelasan:

{          }  A "function."
 +            Add the input numbers.
  (           Decrement.
   {     }g   A while loop.
    )         Increment.
     Amr      Random number [0,9).
        !     Boolean NOT.

Algoritme dasar adalah "while (peluang 0,1), menambah angka," yang menghilangkan kebutuhan untuk rekursi.


8

Javascript ES6, 38 byte

f=(a,b)=>Math.random()<.1?f(a,b+1):a+b

f=(a,b)=>new Date%10<1?f(a,b+1):a+buntuk 35 byte
WallyWest

2
@WallyWest Sayangnya probabilitas ketika menggunakan Datetimestamp tidak akan akurat karena jika dievaluasi trueakan terus menambahkan 1selama sisa milidetik.
user81655

Saya mencoba distribusi geometris f=(a,b)=>a+b-~~Math.log10(Math.random())tetapi 2 byte lebih lama.
Neil

8

MATL , 14 13 12 byte

is`r.1<tb+w]

Ini 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:

i         % input [a b]
s         % sum a and b
`         % do...while loop                                      
  r       % get a uniformly distributed pseudorandom numbers between 0 and 1       
  .1      % push 0.1 onto the stack                                   
  <       % is the random number less than 0.1?
  t       % duplicate the T/F values                                        
  b       % bubble a+b to the top of the stack                       
  +       % add the T/F to a+b     
  w       % swap elements in stack to get the other T/F back to exit/continue the loop                           
]         % end    

Lepas 1 byte dengan mengubah spesifikasi input (dari ii+menjadi is).


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.

iir10,2$YlZo-+

Dalam kode ini, 10,2$YlZo-apakah basis-10 logaritma dari angka acak dan dibulatkan ke bilangan bulat terdekat.


Komentar yang adil, meskipun saya ingin melihat Anda menghasilkan 15 dengan solusi lain yang disajikan: P Cara lain, untuk 15 byte, adalah versi perulangan sederhana ii+`10Yr1=tb+w]:, belum golf.
David

Sebenarnya saya bisa menambah loop lebih pendek! Terima kasih @ ThomasKwa!
David

Dilakukan dengan sangat baik!
Luis Mendo

7

Binary-Encoded Golfical , 32 29 +1 ( -xflag) = 30 byte

Hexdump (diedit secara manual untuk mengoreksi bug di bagian image-to-binary dari transpiler, yang telah diperbaiki):

00 B0 02 15 14 0C 01 14 15 14 1B 1E 3A 14 0C 01
14 00 0A 14 38 00 01 23 1D 4C 14 17 14

Pengkodean ini dapat dikonversi kembali ke representasi grafis asli menggunakan utilitas Encoder yang disertakan, atau dijalankan langsung menggunakan -xflag.

Gambar asli: masukkan deskripsi gambar di sini

50x diperbesar:

masukkan deskripsi gambar di sini

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).


2
Bisakah Anda menambahkan penjelasan? Ini sangat keren.
kucing

7

Python, 66 65 64 63 byte

from random import*
g=lambda*s:randint(0,9)and sum(s)or g(1,*s)

Cobalah online

Terima kasih kepada Sherlock9 untuk koreksi dan byte yang disimpan.

Terima kasih kepada Mathias Ettinger untuk byte lainnya.

Berkat mbomb007 untuk satu byte.




@ Hanya menggunakan ASCII .9>random()tidak cukup 9-dari-10, karena distribusi float yang tidak merata
Mego

6

Julia, 30 byte

f(a,b)=rand()>0.9?f(a,b+1):a+b

Ini adalah fungsi rekursif fyang 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.


6

TI-BASIC, 15 byte

While rand<.1
Ans+.5
End
sum(Ans

Ini mengambil input dari daftar dua elemen Ans. Meskipun angka acak kurang dari 0.1, itu menambahkan vektor 0.5dalam daftar. Meningkatkan setiap elemen dengan 0.5menambah jumlah dengan 1. Saya percaya ini adalah solusi TI-BASIC terpendek.

Program 9-byte sum(Ans)-int(log(10randtidak berfungsi, karena randhanya memiliki 14 digit presisi, dan karenanya tidak dapat memberikan angka kurang dari 10 -14 .


1
Perlu dicatat bahwa untuk menambahkan 14, Anda juga harus menonton babi terbang dan neraka membeku. Dan pada saat Anda menambahkan 14, saya akan melakukan sesuatu dengan hidup saya.
Nic Hartley

5

APL, 17 byte

{1=?10:⍺∇⍵+1⋄⍺+⍵}

Ini adalah fungsi diad yang tidak disebutkan namanya.

Tidak Disatukan:

{1=?10:            ⍝ If a random number between 1 and 10 is 1,
       ⍺∇⍵+1       ⍝ Recurse on the inputs with one incremented
            ⋄⍺+⍵}  ⍝ Otherwise return the sum of the inputs

5

Pyth, 14 12 byte

KsQW!OT=hK;K

Golf Pyth asli pertamaku!

Mengambil input pada STDIN dalam format a,b.

Penjelasan:

KsQ       read STDIN, assign sum to variable K
W         while...
  !OT       not rand(10)
  =hK;      increment K
K         implicit-output of K

Terima kasih kepada @FryAmTheEggman karena telah mengurangi dua karakter dengan memberi saya cara yang lebih singkat untuk meningkatkan variabel!


5

Vitsy , 12 10 byte

aR)[1+0m]+
aR          Get a random number in [0,10)
  )[    ]   If its truncated int is 0, do the stuff in brackets.
    1+0m    Add 1 to one of the items and execute the 0th index of code.
         +  Add the numbers together.

Cobalah online!

Perhatikan bahwa ini memiliki kemungkinan kecil kesalahan stack overflow. Kami sedang berbicara tentang (.1)^400kesempatan. Itu juga keluar karena kesalahan karena bagaimana saya menyebabkan rekursi.


4

Lisp, 58 byte

Pertama kali saya menulis Lisp!

(defun +(a b)(if(<(random 10)9)(- a(- b))(- a(-(+ b 1)))))

Anda dapat menggunakan tambahan khusus ini persis seperti yang biasanya Anda tambahkan di Lisp:

> (+ 1 3)
4
> (+ 1 3)
5

Saya akan senang mendengar saran karena saya baru mengenal bahasa ini.


Akan (- a(- -1 b))bekerja Menghemat 2 byte jika berhasil.
Neil

@Neil, saya tidak berpikir itu berfungsi karena fungsinya harus rekursif
sudo rm -rf slash

Terima kasih telah menjelaskan mengapa ekspresinya terlihat sangat rumit.
Neil

4

Serius, 10 byte

,Σ1±╤_G_\+

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:

,Σ1±╤_G_\+
,Σ          get sum of input
  1±╤_      push ln(0.1)
      G_    push ln(random(0,1))
        \   floored division
         +  add

Diberikan variabel acak X ~ Uniform(0, 1), itu dapat ditransformasikan menjadi variabel acak Y ~ Geometric(p)dengan rumus Y = floor(log(X)/log(p)).


3

Mathematica, 32 byte

If[RandomReal[]<.1,+##,#0@##+1]&

Penjelasan:

                               &   A function returning
If[                           ]     if
   RandomReal[]                       a random number in [0,1)
               <                     is less than
                .1                    .1
                  ,                 , then
                   +                 the sum of
                    ##                all arguments
                      ,             , otherwise,
                       #0@            this function applied to
                          ##           all arguments
                            +        plus
                             1        one.

Perhatikan bahwa fungsi ini berfungsi untuk sejumlah input.



3

Permen , 11 byte

+#10H{.}10g

Bentuk panjangnya adalah:

add          # add two numbers on the stack
number digit1 digit0 rand  # random int from 0 to 9         
if           # if non-zero
  retSub     # terminate loop
endif
digit1       # push 1 to stack
digit0 goto  # loop to start

3

C, 71 51 39 37 byte

Golf 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

a(x,y){return(rand()<.1?a(1,y):y)+x;}

EDIT 2: memotong 12 byte, mengikuti gnu99, setiap variabel adalah int jika tidak dinyatakan sebaliknya. Hal yang sama berlaku untuk jenis fungsi kembali

a(x,y){return rand()<0.1?a(x,y+1):x+y;}

EDIT: memotong 20 byte, lupa bahwa .h dasar tidak diperlukan dalam C99 (menggunakan gcc misalnya). Ini akan menghasilkan peringatan :)

int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

Solusi 71 Bytes:

#include <stdlib.h>
int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

Jika Anda ingin melihat banyak output, Anda dapat menggunakan kode berikut

#include <stdio.h> 
#include <stdlib.h>
int a(int x,int y){return rand()<0.1?a(x,y+1):x+y;}

int main(void) 
{
    int i,j;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            printf("%d + %d = %d\n",i,j,a(i,j));
    return 0;
}

3

MATL , 12 13 14 byte

r.1H$YlY[ihs

Input berupa formulir [3 4] , yaitu, vektor baris dengan dua angka.

Contoh

>> matl r.1H$YlY[ihs
> [3 4]
7

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.

r        % random number with uniform distribution in (0,1)
.1       % number 0.1
H$       % specify two inputs for next function
Yl       % logarithm in specified base (0.1)
Y[       % floor. This produces the geometric random variable with parameter 0.1
i        % input vector of two numbers
h        % concatenate horizontally with the previously generated random value
s        % sum of vector elements

3

Microscript , 29 21 byte

isi+vzr10!{l1vzr10!}l

Saya mencoba membuat jawaban Microscript II tetapi karena beberapa alasan saya tidak bisa mendapatkan loop tambahan berfungsi dengan benar :(


3

Mouse-2002 , 41 39 38 byte

Tidak ada rekursi.

&TIME &SEED ??&RAND k*&INT 9=[+1+!|+!]

Dijelaskan:

&TIME &SEED               ~ painfully obvious

? ?                       ~ get some input
&RAND 10 * &INT 8 >       ~ get a random number 0-1 * 10, make it an int & check if >8
[                         ~ if true
  + 1 + !                 ~ add the input then add 1 and print
|                         ~ else
  + !                     ~ add and print
]                         ~ endif
$                         ~ (implicit) end of program

Atau, jika Anda penggemar pemrograman fungsional, dan rekursi adalah kesepakatan Anda, maka 57 byte :

&TIME &SEED #A,?,?;!$A&RAND k*&INT 9=[#A,1%,2%1+;|1%2%+]@

Dijelaskan:

&TIME &SEED            ~ painfully obvious

#A, ?, ?; !            ~ call with input & print

$A                     ~ begin a definition of a function A

  &RAND 10 * &INT 8 >  ~ same as above
  [
    #A, 1%, 2% 1 +;    ~ call with args and add 1
  |
    1% 2% +            ~ else just add
  ]
@                      ~ end func
$                      ~ as above

3

Jelly , 7 byte (tidak bersaing)

‘⁵XỊ¤¿+

Cobalah online!

Bagaimana itu bekerja

‘⁵XỊ¤¿+  Main link. Arguments: n, m (integers)

    ¤    Combine the three atoms to the left into a niladic chain.
 ⁵       Yield 10.
  X      Pseudo-randomly generate a positive integer not greater than 10.
   Ị     Insignificant; test if the generated integer is 1 (or less).
     ¿   While chain yields 1:
‘          Increment n.
      +  Add m to the result.

3

APL (Dyalog Unicode) , 13 12 byte SBCS

Pada dasarnya sama dengan solusi Pyth FryAmTheEggman . -1 terima kasih kepada Erik the Outgolfer.

Fungsi infiks diam-diam anonim.

{⍵+1=?10}⍣=+

Cobalah online!

+ tambahkan argumen

{... }⍣= terapkan fungsi berikut sampai dua aplikasi berturut-turut memiliki hasil yang sama:

?10 bilangan bulat acak dalam kisaran 1–10

1= Apakah sama dengan itu? (yaitu 1 / 10 th kesempatan)

⍵+ tambahkan argumen itu


Anda bisa mengambil dua bilangan bulat sebagai dua argumen dan menghapus /.
Erik the Outgolfer

@EriktheOutgolfer Ya.
Adám

2

Perl 6 , 26 byte

Sebenarnya melakukannya secara rekursif:

sub f{.1>rand??f |@_,1!![+] @_} # 31 bytes

Buat urutan 1s yang mungkin kosong diikuti oleh argumen, lalu jumlahkan semuanya.

{[+] {1}...^{rand>.1},|@_} # 26 bytes

(Ini benar-benar dapat mengambil sejumlah argumen)

pemakaian:

# give the lambda a name
my &f = {...}

say f 1,2; # one of 3,4,5 ... *


2

Pyth, 11 byte

+sQ-18l`hO0

Port Pyth langsung dari jawaban Python saya .

+             Add up
 sQ            the sum of the input and
   -           the difference of
    18          18 and
      l`         the string length of
        hO0       one plus a random number in [0,1)

2

Oktaf, 20 byte

@(a,b)a+b+geornd(.9)

Jumlah input, ditambah sampel acak dari distribusi geometrik dengan parameter 0.9.


2

Serius, 13 byte

,,1W+9uJYWDkΣ

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:

,,1W+9uJYWDkΣ
,,1            get input, push 1
   W     W     while loop:
    +            add top two elements
     9uJ         push a random integer in [0, 9]
        Y        push 1 if random value is falsey (0) else 0
          DkΣ  decrement top value and add everything together

Loop sementara meninggalkan tumpukan seperti ini:

n: the # of times the random value was < 0.1, plus 1
b: the second input
a: the first input

Bergeser ke natas dengan 1 diperlukan untuk menjalankan loop sementara, karena 0ini adalah falsey. Ini mudah ditangani dengan mengurangi nsetelah loop sementara, jadi hasil akhirnya adalah a + b + (n - 1).


2

MATLAB, 51 byte

function f(a,b)
if rand > .1;a+b;else;f(a,b+1);end

Hasilnya ditemukan dalam variabel otomatis 'ans'

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.