알렉스 스타일 추가


57

Alex의 영광스러운 영감에서 영감을 받아 R을 배우십시오. 우리는 Alex의 "하나의 진정한 R 프로그램"을 겸손하게 재현 할 것입니다.

Alex 스타일 덧셈은 다음과 같이 작동합니다. 주어진 두 숫자의 합을 단순히 90 % 확률로, 그리고 첫 번째 숫자와 두 번째 숫자 + 1을 재귀 적으로 추가 할 확률은 10 %입니다. 이는 잠재적으로 , 1 개 이상 추가 할 수 없습니다.

도전

두 개의 정수를 사용하고 정의 된대로 Alex를 추가하는 전체 프로그램 또는 함수를 작성하십시오. 언어에 꼬리 재귀가 없으면 프로그램에서 오버플로가 발생하지 않는다고 가정 할 수 있습니다. (확률이 동일하다면 재귀 적으로 구현할 필요는 없습니다.)

참조 구현 (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;
  }
}

이 바이올린을 온라인으로 사용해보십시오.

리더 보드

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
따라서 두 확률과 실패 확률이 1/10 인 기하 확률 변수를 더한 것입니까?
xnor December

@xnor 본질적으로 그렇습니다. 나는 그것을 이해하기 쉽도록 재귀 적으로 정의했지만 재귀 적으로 수행 할 필요는 없습니다 (예 : CJam 솔루션은 그렇지 않습니다)
spaghetto

10
왜 20 분 동안 샌드 박스를 만들었습니까? 샌드 박스의 요점이 빠져있는 것 같습니다.
피터 테일러

3
@PeterTaylor 그와 관련된 하나의 사소한 문제는 거의 즉시 수정되었으며 질문은 너무 간단하여 오랫동안 샌드 박스에 머물 필요가 없다고 생각했습니다 (이미 충분한 동료라고 생각한 10 명의 사람들이 이미 보았습니다) 그런 간단한 도전에 대한 검토). 내가 샌드 박스에 넣은 주된 이유는 사람들이 그것이 너무 단순하다고 생각했는지 확인하기 위해서였습니다.
스파게티

2
나는 여전히 중요한 문제가 있다고 말하고 싶습니다. 구현이 재귀 함수로 작성되는지 또는 올바른 배포를 제공하는지 여부는 확실하지 않지만 지금 그것을 명확히하는 것에 대해서는 아무것도 늦습니다.
Peter Taylor

답변:


40

피스, 8

u+G!OTsQ

온라인으로 사용해보십시오

이것은 감소시 Pyth의 두 번째 모드를 사용합니다.

설명

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

여분의 alex-add가 발생하면 다시 실행되지만 그렇지 않은 경우 종료됩니다.


13
이것은 ... 순수한 흑 마술입니다. O_o
Doorknob

1
이건 말도 안돼
cat

36

파이썬 2, 55 바이트

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

이것은 절대적으로 기괴한 방법입니다.

이 함수 random는 [0,1)로 부동 소수점을 제공하며 기본적으로 문자열 표시는 소수점 다음에 16 자리를가집니다 (총 18 자). 그러나 후행 0은 생략되므로 짧을 수 있습니다. 끝에서 자릿수를 읽으면 각각 1/10의 확률은 0이되고 0이 아닌 자릿수에 도달하면 중지합니다. 따라서 후행 0의 수는 Alex가 만드는 재귀의 수와 같이 분산되므로이 분포에서 18을 뺀 문자열 길이로 샘플링 할 수 있습니다.

실제로 파이썬은 작은 숫자, 때로는 과학 표기법을 위해 18 자리 이상을 표시 하므로이 문제를 해결하기 위해 1을 추가합니다.

이것은 합보다 15 이상을 더 많이주지는 않지만 10 ^ 15는 우주 광선이 계산을 방해 할 가능성 보다 훨씬 작기 때문에 괜찮습니다 .


1
죄송합니다.이 답변은 10 ^ -15 회 제대로 작동하지 않을 가능성이 있으므로 링크 된 메타 게시물에 의해 명시 적으로 금지되어 있습니다.
pppery

22

R, 60 47 28 바이트

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

이것은 두 개의 숫자를 받아들이고 숫자를 반환하는 명명되지 않은 함수 객체입니다. 재귀를 사용하지 않습니다.

xnor이 주석에서 지적 했듯이이 문제는 단순히 두 개의 숫자와 실패 확률 1/10의 기하 확률 변수를 더하는 것으로 볼 수 있습니다.

왜 그럴까요? 게시물에 설명 된 것처럼 재귀 측면에서 생각하십시오. 반복 할 때마다 10 %의 확률로 1을 추가하고 재귀하고 90 %의 확률로 더 이상 추가하지 않고 함수를 종료 할 수 있습니다. 각 반복은 "Add 1, recurse"(실패) 및 "exit"(성공) 결과를 가진 자체 독립적 인 Bernoulli 시험 입니다. 따라서 실패 확률은 1/10이고 성공 확률은 9/10입니다.

일련의 독립적 인 Bernoulli 시행을 처리 할 때 단일 성공을 얻는 데 필요한 시행 횟수는 기하 분포를 따릅니다 . 우리의 경우, 각 재귀는 1을 더하는 것을 의미하므로, 함수를 마지막으로 종료 할 때, 우리는 본질적으로 첫 번째 성공 전에 발생한 실패의 수를 세었습니다. 즉, 결과가 사라지는 양은 기하 분포와의 임의 편차입니다.

여기서 우리는 rgeom기하 분포에서 임의의 값을 반환하는 R의 확률 분포 내장 및 use의 이점을 활용할 수 있습니다 .

언 골프 드 :

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

13

Minkolang 0.14 , 19 11 12 바이트

이것은 "기능"버전입니다. 스택에 이미 있다고 가정 a하고 b튀어 나와 수정 된 버전을 푸시합니다 a+b. Minkolang의 기능에 가장 가까운 상응 사용하는 것입니다 F오프 팝하는 b, a그리고 점프 (a,b)codebox에. 그런 다음 프로그램 카운터가에 도달하면 사용 된 f위치 F로 되돌아갑니다 .

(+$01$h`d)xf

이것은 전체 프로그램 버전 인 15 바이트 입니다. ( nn입력에서 두 개의 숫자를 가져와 N.결과를 출력하고 중지합니다.)

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

Doorknob의 답변 에서 알고리즘을 훔쳤습니다 . while 루프는 생성 된 난수가 0.1보다 작을 때마다 반복되어 매번 1을 추가합니다. 여기 (전체 프로그램 버전)를 시도하고 여기에서 100 번 실행하십시오 .

설명

(              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

가장 영리한 부분은 d입니다. 해당 시점의 스택 맨 위는 0 또는 1입니다. 0이면 while 루프가 종료됩니다. 그렇지 않으면 계속됩니다. 스택 상단을 복제하면 [a+b,1]루프를 통해 두 번째가되므로 +처음에는 1을 추가합니다 (그리고 후속 트립도 마찬가지입니다).


이것이 실제로 기능입니까? 언어 문서를 신속하게 스캔했으며 함수 정의를 설명하는 내용을 찾지 못했습니다. 설명을 바탕으로 코드 조각처럼 보입니다.
Reto Koradi

@RetoKoradi : 그런 "코드 조각"을 자체 줄에 넣고 0kF (여기서 k는 일부 숫자)로 건너 뛰고 끝에 f로 다시 이동할 수 있습니다. Minkolang에서 가장 가까운 기능입니다.
El'endia Starman

2
기술적으로 "CJam 코드 조각은 함수입니다.이를 중괄호로 묶어야합니다"라고 말하는 것과 같지 않습니까? 적어도 f문자 수에 마지막에를 포함시켜야합니다 (그리고 여분의 학대를 느끼고 있다면 기술적 으로 앞의 줄 바꿈을 포함해야하지만 필요하다고 생각하지는 않습니다).
Doorknob

1
언어에 기능이없는 경우 언제든지 전체 프로그램을 게시 할 수 있습니다. 필자는 "함수"라고 할 때 명명 된 함수이거나 익명 함수 (일반적으로 함수 변수에 할당 할 수있는 표현식) 여야한다는 것을 이해합니다. 한때 CJam에 이와 비슷한 것을 게시했으며 Martin은 함수가 아닌 코드 조각이라고 말하면서 신속하게 전화했습니다.
Reto Koradi

@RetoKoradi : 알겠습니다. Doorknob의 제안에 대해 어떻게 생각하십니까?
El'endia Starman

12

CJam, 12 11 바이트

{{+Amr!}h;}

이 슈퍼 영리한 트릭으로 바이트를 절약 한 @ MartinBütter에게 감사드립니다!

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

이전 답변 :

{+({)Amr!}g}

온라인으로 사용해보십시오 .

설명:

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

기본 알고리즘은 "while (0.1 기회), 숫자 증가"이므로 재귀가 필요하지 않습니다.


8

자바 스크립트 ES6, 38 바이트

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

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

2
@WallyWest 불행하게도 Date타임 스탬프를 사용할 때의 가능성 은 정확하지 않습니다. 평가 하면 나머지 밀리 초 동안 true계속 추가 되기 때문 1입니다.
user81655

기하학적 분포를 시도했지만 f=(a,b)=>a+b-~~Math.log10(Math.random())2 바이트 더 깁니다.
Neil

8

MATL , 14 13 12 바이트

is`r.1<tb+w]

이것은 루프 방법 일 뿐이며 입력 (으로 입력 [a b])을 추가 한 다음 0과 1 사이의 균일 난수가 0.1보다 작은 동안 계속 추가하십시오. 아래 전체 설명 :

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    

입력 스펙을 변경하여 1 바이트를 제거했습니다 (에서 ii+is).


이전 방법은 0에서 1 사이의 난수의 10 진수 로그를 사용하여 추가 할 양을 계산하는 것을 기반 a+b으로했지만 부동 소수점 정확도로 인해 최대 15 회 반복 만 작동합니다.

iir10,2$YlZo-+

이 코드 10,2$YlZo-에서 난수의 10 진수 로그를 수행하고 가장 가까운 정수로 반올림합니다.


공정한 의견, 다른 해결책을 제시하여 15를 생성하고 싶습니다 : P 15 바이트의 또 다른 방법은 간단한 루핑 버전입니다 : ii+`10Yr1=tb+w]아직 골프를 치지 않았습니다.
David

실제로 루프를 짧게 할 수 있습니다! 감사합니다 @ThomasKwa!
David

아주 잘 했어요!
Luis Mendo

7

이진 인코딩 Golfical , 32 29 + 1 ( -x플래그) = 30 바이트

Hexdump (트랜스 파일러의 이미지에서 이진 부분의 버그를 수정하기 위해 수동으로 편집 됨)

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

이 인코딩은 포함 된 인코더 유틸리티를 사용하여 원래 그래픽 표현으로 다시 변환하거나 -x플래그를 사용하여 직접 실행할 수 있습니다 .

원본 이미지 : 여기에 이미지 설명을 입력하십시오

확대 50 배 :

여기에 이미지 설명을 입력하십시오

설명 : 맨 위 행이 기본 블록입니다. 숫자를 읽고, 오른쪽에 복사하고, 다른 숫자를 읽고, 추가하고, 오른쪽에 결과를 복사하고, RNG 작업을 수행하고, 확률이 90 % 인 경우 더하기 결과를 인쇄합니다. 나머지 시간은 맨 아래 행으로 보내져 첫 번째 셀에 하나를 넣고 추가 명령 직전에 기본 행으로 돌아갑니다 (북쪽 회전 후 동쪽 회전 사용).


2
설명을 추가 할 수 있습니까? 이것은 정말 멋지다.
cat


6

줄리아, 30 바이트

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

f두 개의 숫자를 허용하고 같은 유형의 숫자를 반환 하는 재귀 함수 입니다. 모든 숫자 유형에 적합합니다.

먼저 0과 1 사이의 임의의 부동 소수점이 0.9보다 큰지 확인합니다. 그렇다면, 우리는 약간의 '어딘가'를 조금 더 반복해서 재귀하고, 그렇지 않으면 우리는 단지 추가합니다.


6

TI-BASIC, 15 바이트

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

입력을의 두 요소 목록으로 가져옵니다 Ans. 난수는보다 0.1작지만 0.5목록에 벡터화를 더 합니다. 각 요소를 늘리면 0.5합계가 1 씩 증가합니다. 이것이 가장 짧은 TI-BASIC 솔루션이라고 생각합니다.

9 바이트 프로그램이 sum(Ans)-int(log(10rand있기 때문에, 작동하지 않는 rand경우에만 정밀도의 14 개 자리를 가지고 있으며, 따라서 숫자보다 10 줄 수 없다 -14 .


1
14를 더하려면 돼지가 날아가서 지옥이 얼어 붙는 것을 지켜봐야합니다. 그리고 14를 더할 때, 나는 내 인생에서 무언가를했을 것입니다.
Nic Hartley

5

APL, 17 바이트

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

이것은 명명되지 않은 2 차원 함수입니다.

언 골프 드 :

{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 바이트

KsQW!OT=hK;K

나의 첫번째 진짜 Pyth 골프!

STDIN에 입력을 형식으로 취합니다 a,b.

설명:

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

변수를 증가시킬 수있는 더 짧은 방법을 제공하여 두 개의 문자를 제거해 준 @FryAmTheEggman에게 감사합니다!


5

Vitsy , 12 10 바이트

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.

온라인으로 사용해보십시오!

이것은이 있습니다 작은 스택 오버플로 오류의 기회를. 우린 (.1)^400우연 이야 또한 재귀를 일으킨 방법으로 인해 오류가 발생하면 종료됩니다.


4

리스프, 58 바이트

Lisp를 처음 쓰는 것!

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

일반적으로 Lisp에 추가 할 때와 마찬가지로이 특수 추가를 사용할 수 있습니다.

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

언어에 익숙하지 않은 제안을 듣고 싶습니다.


시겠습니까 (- a(- -1 b))일? 그렇다면 2 바이트를 절약합니다.
Neil

@Neil, 나는 함수가 재귀 적이어야하기 때문에 작동하지 않는다고 생각한다
sudo rm -rf slash

표현이 왜 그렇게 번거로운 지 설명해 주셔서 감사합니다.
Neil

4

진지하게, 10 바이트

,Σ1±╤_G_\+

이 프로그램은 균일 분포를 변환하여 기하 분포에서 랜덤 변수를 생성합니다. 입력을 목록으로 취합니다 [2,3](선택 사항 중괄호). 온라인으로 사용해보십시오 .

설명:

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

임의의 변수가 주어지면 수식 X ~ Uniform(0, 1)을 사용하여 임의의 변수로 변환 할 수 있습니다 .Y ~ Geometric(p)Y = floor(log(X)/log(p))


3

수학, 32 바이트

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

설명:

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

이 기능은 여러 입력에 작동합니다.



3

캔디 , 11 바이트

+#10H{.}10g

긴 형식은 다음과 같습니다.

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 바이트

첫 번째 코드 골프, C에서 ... 나는 그것이 이길 것이라고 생각하지 않으며, 많이 골프를 칠 수 있습니다.

편집 3 : 0.1 대신 0.1을 쓰고 삼항 연산자를 다시 작성하여 @Mego 덕분에 cuted 2 바이트

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

편집 2 : gnu99에 이어 cuted 12 바이트, 달리 명시하지 않으면 모든 변수는 정수입니다. 함수의 리턴 타입도 마찬가지입니다.

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

편집 : cuted 20 바이트, C99에서 기본 .h가 필요하지 않은 것을 잊었습니다 (예 : gcc 사용). 경고가 발생합니다 :)

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

71 바이트 솔루션 :

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

많은 출력을보고 싶다면 다음 코드를 사용할 수 있습니다

#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 바이트

r.1H$YlY[ihs

입력 형식 [3 4]은 즉, 두 숫자가있는 행 벡터입니다.

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

설명

이것은 변환 을 균일 한 랜덤 변수 에 직접 적용하여 루프없이 기하 랜덤 변수를 생성합니다 . 1 바이트를 저장하기 위해 log a / log 0.1 대신 log 0.1 a 가 사용됩니다 .

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

Mouse-2002 , 41 39 38 바이트

재귀가 없습니다.

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

설명 :

&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

또는 함수형 프로그래밍 팬이라면 재귀는 57 바이트입니다 .

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

설명 :

&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 바이트 (비경쟁)

‘⁵XỊ¤¿+

온라인으로 사용해보십시오!

작동 원리

‘⁵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 바이트 SBCS

기본적으로 FryAmTheEggman의 Pyth 솔루션 과 동일 합니다 . Outgolfer Erik에게 감사합니다.

익명의 암묵적 삽입 기능.

{⍵+1=?10}⍣=+

온라인으로 사용해보십시오!

+ 인수를 추가

{}⍣= 두 개의 연속 응용 프로그램이 동일한 결과를 가질 때까지 다음 기능을 적용하십시오.

?10 1-10 범위의 난수

1= 그것과 같은가요? (즉, (1) / (10) 번째 기회)

⍵+ 그것에 인수를 추가


두 개의 정수를 두 개의 인수로 사용하여를 제거 할 수 /있습니다.
Outgolfer Erik

@EriktheOutgolfer 그래.
Adám

2

펄 6 , 26 바이트

실제로 재귀 적으로 수행하십시오.

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

비어있는 1s 시퀀스와 인수를 만들어서 모두 합산하십시오.

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

(실제로 많은 수의 인수를 취할 수 있습니다)

용법:

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

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


2

Pyth, 11 바이트

+sQ-18l`hO0

파이썬 답변 의 직접 Pyth 포트 .

+             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

옥타브, 20 바이트

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

입력의 합과 모수를 갖는 기하 분포의 랜덤 표본 0.9.


2

정말 13 바이트

,,1W+9uJYWDkΣ

정수를 사용한다는 점을 제외하고 Doorknob의 CJam 답변과 비슷한 전략을 사용합니다 (임의의 부동 소수점이 0.1 미만인 경우 증가). 임의의 정수 [0,9]가 1 미만인 경우 에는 증가 합니다.

온라인으로 사용해보십시오 (수동 입력 필요)

설명:

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

while 루프는 다음과 같이 스택을 떠납니다.

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

nwhile 루프가 실행 0되려면 1만큼 위로 이동 해야합니다 . nwhile 루프 후 감소하여 쉽게 처리 할 수 있으므로 최종 결과는 a + b + (n - 1)입니다.


2

MATLAB, 51 바이트

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

결과는 'ans'자동 변수에 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.