Bổ sung kiểu Alex


57

Lấy cảm hứng từ vinh quang của Alex Tìm hiểu cho bạn một R rất tốt, chúng tôi sẽ khiêm tốn tái tạo lại "một chương trình R thực sự" của Alex - nhưng với một bước ngoặt.

Bổ sung kiểu Alex hoạt động như thế này - nó có 90% cơ hội chỉ đơn giản là trả lại tổng của hai số đã cho và 10% cơ hội đệ quy Alex thêm số thứ nhất và số thứ hai + 1. Điều này có nghĩa là, có khả năng , một bổ sung có thể được tắt bởi 1 hoặc nhiều hơn.

Thử thách

Viết một chương trình hoặc hàm đầy đủ có hai số nguyên và Alex thêm chúng như được định nghĩa. Bạn có thể cho rằng chương trình của bạn sẽ không chồng tràn nếu ngôn ngữ của bạn không có đệ quy đuôi. (Lưu ý rằng bạn không phải thực hiện đệ quy, miễn là xác suất là như nhau.)

Tham chiếu thực hiện (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;
  }
}

Hãy thử fiddle trực tuyến này.

Bảng xếp hạng

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
Vậy nó cho tổng hai số cộng với một biến ngẫu nhiên hình học với xác suất thất bại 1/10?
xnor

@xnor Về cơ bản, vâng. Tôi đã định nghĩa nó một cách đệ quy để dễ hiểu hơn, nhưng bạn không cần phải thực hiện đệ quy (ví dụ: giải pháp CJam không)
một spaghetto

10
Tại sao hộp cát này trong 20 phút? Điều đó dường như là thiếu điểm của hộp cát.
Peter Taylor

3
@PeterTaylor Một vấn đề nhỏ đã được khắc phục gần như ngay lập tức và câu hỏi rất đơn giản Tôi không nghĩ rằng nó cần phải ở trong hộp cát từ lâu (nó đã được xem xét bởi 10 người mà tôi nghĩ là đủ xem xét cho một thách thức đơn giản như vậy). Lý do chính tôi có nó trong hộp cát là để xem mọi người có nghĩ nó quá đơn giản không.
một spaghetto

2
Tôi sẽ nói rằng nó vẫn còn một vấn đề lớn, ở chỗ không rõ liệu bạn có khăng khăng việc triển khai được viết dưới dạng hàm đệ quy hay chỉ đưa ra phân phối đúng, nhưng bây giờ đã quá muộn để làm bất cứ điều gì về việc làm rõ điều đó.
Peter Taylor

Câu trả lời:


40

Bình thường, 8

u+G!OTsQ

Dùng thử trực tuyến

Cái này sử dụng chế độ thứ hai của Pyth khi giảm, tìm kiếm đầu vào lặp đi lặp lại sau đó thoát.

Giải trình

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

Nếu thêm alex-add xảy ra, nó sẽ chạy lại, nhưng nếu không thì nó thoát.


13
Đây ... là ma thuật đen thuần túy. O_o
Doorknob

1
Chuyện này thật vớ vẩn.
con mèo

36

Python 2, 55 byte

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

Đây là một cách hoàn toàn kỳ quái để làm điều đó.

Hàm randomcho dấu phẩy trong [0,1) và biểu diễn chuỗi của nó theo mặc định có 16 chữ số sau dấu thập phân, cho tổng số 18 ký tự. Nhưng, vì dấu 0 được bỏ qua, nên nó có thể ngắn hơn. Đọc các chữ số từ cuối, mỗi chữ số có 1/10 cơ hội là 0 và chúng tôi dừng lại khi chúng tôi đạt được một chữ số khác. Vì vậy, số lượng các số 0 ở cuối được phân phối giống như số lần thu hồi mà Alex thực hiện, vì vậy chúng tôi có thể lấy mẫu từ phân phối này bằng 18 trừ đi độ dài chuỗi.

Trên thực tế, Python sẽ hiển thị hơn 18 chữ số cho các số nhỏ, đôi khi cả ký hiệu khoa học, vì vậy chúng tôi thêm 1 để sửa lỗi này.

Điều này sẽ không bao giờ cho nhiều hơn 15 so với tổng, nhưng điều đó không sao vì 10 ^ 15 ít hơn nhiều so với khả năng một tia vũ trụ phá vỡ tính toán .


1
Xin lỗi, câu trả lời này không hợp lệ, vì nó có cơ hội 10 ^ -15 không hoạt động đúng , bị cấm rõ ràng bởi bài đăng meta được liên kết.
pppery

22

R, 60 47 28 byte

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

Đây là một đối tượng hàm không tên, chấp nhận hai số và trả về một số. Nó không sử dụng đệ quy.

Như xnor đã chỉ ra trong một bình luận, vấn đề này có thể được xem như chỉ cần thêm hai số cộng với một biến ngẫu nhiên hình học với xác suất thất bại 1/10.

Tại sao điều đó lại đúng? Hãy suy nghĩ về nó theo cách đệ quy, như nó được mô tả trong bài viết. Trong mỗi lần lặp, chúng ta có 10% cơ hội thêm 1 và đệ quy và 90% cơ hội thoát khỏi hàm mà không cần thêm. Mỗi lần lặp là thử nghiệm Bernoulli độc lập của riêng mình với kết quả "thêm 1, tái diễn" (thất bại) và "thoát" (thành công). Do đó xác suất thất bại là 1/10 và xác suất thành công là 9/10.

Khi xử lý một loạt các thử nghiệm Bernoulli độc lập, số lượng thử nghiệm cần thiết để đạt được một thành công duy nhất tuân theo phân phối hình học . Trong trường hợp của chúng tôi, mỗi lần đệ quy có nghĩa là thêm 1, vì vậy cuối cùng khi chúng tôi thoát khỏi hàm, về cơ bản chúng tôi đã đếm số lần thất bại xảy ra trước thành công đầu tiên. Điều đó có nghĩa là số tiền mà kết quả sẽ bị tắt là một biến thiên ngẫu nhiên từ một phân phối hình học.

Ở đây chúng ta có thể tận dụng bộ mở rộng phân phối xác suất và sử dụng của R rgeom, trả về một giá trị ngẫu nhiên từ phân phối hình học.

Ung dung:

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

13

Chồn 0,14 , 19 11 12 byte

Đây là phiên bản "chức năng"; nó giả định abđã ở trên stack, bật chúng ra và đẩy phiên bản sửa đổi của a+b. Tương đương gần nhất với chức năng trong Minkolang là sử dụng F, mà bật tắt b, avà nhảy đến (a,b)trong codebox. Sau đó, khi bộ đếm chương trình chạm một f, nó sẽ quay trở lại nơi Fđược sử dụng.

(+$01$h`d)xf

Đây là phiên bản chương trình đầy đủ, 15 byte . ( nnlấy hai số từ đầu vào và N.đầu ra kết quả và dừng lại.)

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

Tôi đã đánh cắp thuật toán từ câu trả lời của Doorknob ; vòng lặp while lặp lại miễn là số ngẫu nhiên được tạo nhỏ hơn 0,1, thêm 1 lần mỗi lần. Dùng thử tại đây (phiên bản chương trình đầy đủ) và chạy nó 100 lần tại đây .

Giải trình

(              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

Phần thông minh nhất ở đây là d. Đỉnh của ngăn xếp tại thời điểm đó sẽ là 0 hoặc 1. Nếu là 0, vòng lặp while sẽ thoát. Nếu không, nó tiếp tục. Khi tôi nhân đôi đỉnh của ngăn xếp, đây sẽ là [a+b,1]lần thứ hai qua vòng lặp, do đó, +ở đầu sẽ thêm 1 (và tương tự cho các chuyến đi tiếp theo).


Đây thực sự là một chức năng? Tôi nhanh chóng quét qua tài liệu ngôn ngữ và không thể tìm thấy bất cứ điều gì mô tả các định nghĩa hàm. Dựa trên lời giải thích, nó trông giống như một đoạn mã.
Reto Koradi

@RetoKoradi: Tôi có thể đặt một "đoạn mã" như vậy trên dòng riêng của nó, nhảy tới nó với 0kF (trong đó k là một số) và nhảy trở lại với f ở cuối. Đó là cách gần nhất bạn sẽ có được một chức năng trong Minkolang.
El'endia Starman

2
Không phải về mặt kỹ thuật như nói "đoạn mã CJam của tôi là một hàm, bạn chỉ cần bao quanh nó bằng dấu ngoặc nhọn"? Ít nhất, có lẽ bạn nên bao gồm phần fcuối của số char (và về mặt kỹ thuật là dòng mới trước nếu bạn cảm thấy quá tầm thường, nhưng tôi không nghĩ điều đó là cần thiết).
Doorknob

1
Nếu ngôn ngữ không có chức năng, bạn luôn có thể đăng các chương trình đầy đủ. Hiểu biết của tôi là khi nó nói "hàm", nó phải là một hàm được đặt tên hoặc một hàm ẩn danh (thường là một biểu thức có thể được gán cho một biến chức năng). Tôi đã từng đăng một cái gì đó tương tự như thế này trên CJam, và Martin nhanh chóng gọi tôi ra trên đó, nói rằng đó là một đoạn mã chứ không phải là một chức năng.
Reto Koradi

@RetoKoradi: Được rồi, điều đó có thể hiểu được. Bạn nghĩ gì về đề nghị của Doorknob?
El'endia Starman

12

CJam, 12 11 byte

{{+Amr!}h;}

Cảm ơn @ MartinBütter vì đã tiết kiệm một byte với thủ thuật siêu thông minh này!

{         }
 {     }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.

Câu trả lời cũ:

{+({)Amr!}g}

Hãy thử trực tuyến .

Giải trình:

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

Thuật toán cơ bản là "while (0,1 cơ hội), tăng số", loại bỏ sự cần thiết của đệ quy.


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+bcho 35 byte
WallyWest

2
@WallyWest Thật không may, xác suất khi sử dụng Datedấu thời gian sẽ không chính xác bởi vì nếu đánh giá, truenó sẽ tiếp tục thêm 1trong phần còn lại của mili giây.
dùng81655

Tôi đã thử phân phối hình học f=(a,b)=>a+b-~~Math.log10(Math.random())nhưng nó dài hơn 2 byte.
Neil

8

MATL , 14 13 12 byte

is`r.1<tb+w]

Đây chỉ là phương thức vòng lặp, thêm các đầu vào (được nhập dưới dạng [a b]) sau đó tiếp tục thêm một trong khi một số ngẫu nhiên thống nhất giữa 0 và 1 nhỏ hơn 0,1. Mô tả đầy đủ dưới đây:

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    

Lấy ra 1 byte bằng cách thay đổi thông số kỹ thuật đầu vào (từ ii+đến is).


Cách cũ dựa trên việc lấy nhật ký cơ sở 10 của một số ngẫu nhiên trong khoảng từ 0 đến 1 để tính ra số tiền cần thêm a+b, tuy nhiên, nó chỉ hoạt động tối đa 15 lần lặp lại do độ chính xác của dấu phẩy động.

iir10,2$YlZo-+

Trong mã này, 10,2$YlZo-logarit cơ số 10 của số ngẫu nhiên và làm tròn đến số nguyên gần nhất.


Nhận xét công bằng, mặc dù tôi muốn thấy bạn tạo 15 với bất kỳ giải pháp nào khác được trình bày: P Một cách khác, với 15 byte, là phiên bản lặp đơn giản : ii+`10Yr1=tb+w], chưa được đánh gôn.
David

Trên thực tế tôi có thể amke vòng lặp ngắn hơn! Cảm ơn @ThomasKwa!
David

Hoàn thành rất tốt!
Luis Mendo

7

Golf được mã hóa nhị phân , 32 29 + 1 ( -xcờ) = 30 byte

Hexdump (được chỉnh sửa thủ công để sửa lỗi trong phần hình ảnh thành nhị phân của bộ chuyển mã, đã được sửa chữa):

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

Mã hóa này có thể được chuyển đổi trở lại thành biểu diễn đồ họa ban đầu bằng tiện ích Encoder đi kèm hoặc chạy trực tiếp bằng -xcờ.

Ảnh gốc: nhập mô tả hình ảnh ở đây

Phóng đại 50 lần:

nhập mô tả hình ảnh ở đây

Giải thích: Hàng trên cùng là khối chính. Nó đọc một số, sao chép nó sang bên phải, đọc một số khác, thêm chúng, sao chép kết quả sang bên phải, thực hiện một số công cụ RNG và, với xác suất 90%, in kết quả của phép cộng. Thời gian còn lại, nó được gửi đến hàng dưới cùng, nơi nó đặt một ô trong ô đầu tiên và quay trở lại hàng chính ngay trước lệnh bổ sung (sử dụng rẽ phía bắc rồi rẽ sang hướng đông).


2
Bạn có thể thêm một lời giải thích? Điều này là siêu mát mẻ.
con mèo


6

Julia, 30 byte

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

Đây là một hàm đệ quy fchấp nhận hai số và trả về một số cùng loại. Nó sẽ hoạt động tốt cho bất kỳ loại số.

Đầu tiên, chúng tôi kiểm tra xem một số float ngẫu nhiên trong khoảng từ 0 đến 1 có lớn hơn 0,9 hay không. Nếu vậy, chúng tôi tái diễn với một chút gì đó 'somhin', nếu không chúng tôi chỉ cần thêm.


6

TI-BASIC, 15 byte

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

Điều này lấy đầu vào là một danh sách hai yếu tố từ Ans. Mặc dù một số ngẫu nhiên ít hơn 0.1, nhưng nó được thêm 0.5vào trong danh sách. Tăng mỗi phần tử bằng cách 0.5tăng tổng bằng 1. Tôi tin rằng đây là giải pháp TI-BASIC ngắn nhất.

Chương trình 9 byte sum(Ans)-int(log(10randkhông hoạt động, vì randchỉ có 14 chữ số chính xác và do đó, nó không thể đưa ra một số nhỏ hơn 10 -14 .


1
Đáng chú ý là để thêm 14, bạn cũng sẽ phải xem lợn bay và địa ngục đóng băng. Và khi bạn thêm 14 tuổi, tôi sẽ làm được điều gì đó với cuộc sống của mình.
Nic Hartley

5

APL, 17 byte

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

Đây là một chức năng dyadic không tên.

Ung dung:

{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

Bình thường, 14 12 byte

KsQW!OT=hK;K

Golf Pyth thực sự đầu tiên của tôi!

Đưa đầu vào vào STDIN theo định dạng a,b.

Giải trình:

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

Cảm ơn @FryAmTheEggman đã cạo sạch hai ký tự bằng cách cho tôi một cách ngắn hơn để tăng một biến!


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.

Hãy thử trực tuyến!

Lưu ý rằng đây có một nhỏ cơ hội của một lỗi stack overflow. Chúng ta đang nói về (.1)^400cơ hội. Nó cũng thoát do lỗi do cách tôi gây ra đệ quy.


4

Lisp, 58 byte

Lần đầu tiên tôi viết Lisp!

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

Bạn có thể sử dụng phần bổ sung đặc biệt này chính xác như bạn thường thêm vào Lisp:

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

Tôi rất thích nghe những lời đề nghị vì tôi hoàn toàn mới với ngôn ngữ này.


Sẽ (- a(- -1 b))làm việc? Tiết kiệm cho bạn 2 byte nếu có.
Neil

@Neil, tôi không nghĩ rằng nó hoạt động vì hàm nên được đệ quy
sudo rm -rf slash

Cảm ơn đã giải thích lý do tại sao biểu hiện trông rất cồng kềnh.
Neil

4

Nghiêm túc, 10 byte

,Σ1±╤_G_\+

Chương trình này tạo ra một biến ngẫu nhiên từ phân phối hình học bằng cách chuyển đổi phân phối đồng đều. Nó nhận đầu vào như một danh sách: [2,3](niềng răng tùy chọn). Hãy thử trực tuyến .

Giải trình:

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

Cho một biến ngẫu nhiên X ~ Uniform(0, 1), nó có thể được chuyển thành một biến ngẫu nhiên Y ~ Geometric(p)với công thức Y = floor(log(X)/log(p)).


3

Toán học, 32 byte

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

Giải trình:

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

Lưu ý rằng chức năng này hoạt động cho bất kỳ số lượng đầu vào.



3

Kẹo , 11 byte

+#10H{.}10g

Hình thức dài là:

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

Môn đánh gôn đầu tiên, được thực hiện trong C ... Tôi không nghĩ nó sẽ đánh bại bất cứ thứ gì, và có thể bị đánh golf rất nhiều

EDIT 3: đã cắt 2 byte nhờ @Mego, bằng cách viết .1 thay vì 0.1 và viết lại toán tử ternary

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

EDIT 2: đã cắt 12 byte, theo gnu99, mỗi biến là một int nếu không được nêu khác. Tương tự với kiểu trả về của hàm

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

EDIT: đã cắt 20 byte, quên rằng .h cơ bản không cần thiết trong C99 (ví dụ sử dụng gcc). Nó sẽ tạo ra một cảnh báo :)

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

Giải pháp 71 byte:

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

Nếu bạn muốn xem nhiều đầu ra, bạn có thể sử dụng đoạn mã sau

#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

Đầu vào có dạng [3 4], nghĩa là một vectơ hàng với hai số.

Thí dụ

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

Giải trình

Điều này tạo ra biến ngẫu nhiên hình học không có vòng lặp, bằng cách áp dụng trực tiếp phép biến đổi aa vào biến ngẫu nhiên thống nhất. Lưu ý rằng log 0,1 a được sử dụng thay vì log a / log 0.1 để lưu 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

Kính hiển vi , 29 21 byte

isi+vzr10!{l1vzr10!}l

Tôi đã cố gắng thực hiện một câu trả lời microscript II nhưng vì một số lý do tôi không thể có được vòng lặp bổ sung để hoạt động đúng :(


3

Chuột-2002 , 41 39 38 byte

Không đệ quy.

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

Giải thích:

&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

Hoặc, nếu bạn là một fanboy lập trình chức năng và đệ quy là thỏa thuận của bạn thì 57 byte :

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

Giải thích:

&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 (không cạnh tranh)

‘⁵XỊ¤¿+

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

‘⁵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

Về cơ bản giống như giải pháp Pyth của FryAmTheEggman . -1 cảm ơn Erik the Outgolfer.

Chức năng ẩn danh ẩn danh.

{⍵+1=?10}⍣=+

Hãy thử trực tuyến!

+ thêm các đối số

{... }⍣= áp dụng các chức năng sau đây cho đến khi hai ứng dụng liên tiếp có kết quả tương tự:

?10 số nguyên ngẫu nhiên trong phạm vi 1

1= là một bằng với điều đó? (ví dụ: 1 / 10 thứ cơ hội)

⍵+ thêm đối số vào đó


Bạn có thể lấy hai số nguyên làm hai đối số và loại bỏ /.
Erik the Outgolfer

@EriktheOutgolfer Vâng.
Adám

2

Perl 6 , 26 byte

Thực tế làm điều đó đệ quy:

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

Tạo một chuỗi có thể trống của 1s theo sau là các đối số, sau đó tổng hợp tất cả chúng lại với nhau.

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

(nó thực sự có thể lấy bất kỳ số lượng đối số)

sử dụng:

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

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


2

Bình thường, 11 byte

+sQ-18l`hO0

Một cổng Pyth trực tiếp của câu trả lời Python của tôi .

+             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

Octave, 20 byte

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

Tổng các đầu vào, cộng với một mẫu ngẫu nhiên từ phân phối hình học với tham số 0.9.


2

Nghiêm túc, 13 byte

,,1W+9uJYWDkΣ

Sử dụng một chiến lược tương tự với câu trả lời CJam của Doorknob (số tăng trong khi số float ngẫu nhiên nhỏ hơn 0,1), ngoại trừ nó sử dụng số nguyên và tăng trong khi số nguyên ngẫu nhiên [0,9]nhỏ hơn 1. Việc thiếu đệ quy dễ bị tổn thương.

Dùng thử trực tuyến (cần nhập thủ công)

Giải trình:

,,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

Vòng lặp while rời khỏi ngăn xếp như thế này:

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

Chuyển nlên 1 là cần thiết để có được vòng lặp while để chạy, vì 0là falsey. Nó dễ dàng được xử lý bằng cách giảm nsau vòng lặp while, vì vậy kết quả cuối cùng là a + b + (n - 1).


2

MATLAB, 51 byte

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

Kết quả được tìm thấy trong biến tự động 'ans'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.