アレックススタイルの追加


57

Alexの輝かしいLearn you for R for good goodに触発され Alexの「1つの真のRプログラム」を謙虚に再現しますが、ひねりを加えています。

アレックススタイルの加算はこのように機能します-90%の確率で与えられた2つの数値の合計を返し、10%の確率で最初の数値と2番目の数値+ 1を再帰的に加算します。つまり、潜在的に、追加が1つ以上オフになる場合があります。

チャレンジ

2つの整数を受け取り、定義どおりにAlex-addsする完全なプログラムまたは関数を作成します。言語に末尾再帰がない場合、プログラムはオーバーフローをスタックしないと仮定できます。(確率が同じである限り、再帰的に実装する必要はありません。)

リファレンス実装(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
したがって、2つの数値の合計と、故障確率1/10の幾何学的確率変数が得られますか?
xnor

@xnor基本的にははい。(CJamソリューションは、例えば、ない)、理解しやすくなるように、私は再帰的に定義されていますが、再帰的にそれを行う必要はありません
spaghetto

10
なぜこれが20分間サンドボックス化されたのですか?それは、サンドボックスのポイントが欠けているようです。
ピーターテイラー

3
@PeterTaylorそれに関する1つの小さな問題はほぼすぐに修正され、質問はとても簡単だったので、その間サンドボックスにとどまる必要はないと思いました(すでに十分なピアだと思った10人によって見られていました)このような簡単な課題を確認してください)。私がそれをサンドボックスに入れた主な理由は、人々がそれが単純すぎると思っているかどうかを確かめることでした。
spaghetto

2
実装が再帰的な関数として書かれているのか、それとも正しいディストリビューションを提供するだけなのかが明確ではないという点で、まだ大きな問題があると思いますが、今それを明確にすることは遅すぎます。
ピーターテイラー

回答:


40

Pyth、8

u+G!OTsQ

オンラインで試す

これは、reduceでPythの2番目のモードを使用し、繰り返し入力を探して終了します。

説明

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
ドアノブ

1
ばかげてる。

36

Python 2、55バイト

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

これは絶対に奇妙な方法です。

この関数randomは[0,1)に浮動小数点を与え、その文字列表現はデフォルトで小数点以下16桁で、合計18文字です。ただし、末尾の0は省略されるため、短くなる可能性があります。末尾から数字を読むと、それぞれが1/10の確率で0になり、ゼロ以外の数字に到達すると停止します。したがって、末尾のゼロの数は、アレックスが行う再帰の数と同じように分布するため、この分布から18から文字列の長さを引いてサンプリングできます。

実際、Pythonは小さな数字に対して18桁を超える数字を表示します。科学表記法もあるため、これを修正するために1を追加します。

これは合計よりも15以上多くなることはありませんが、10 ^ 15は宇宙線が計算を中断する可能性よりもはるかに少ないため、問題ありません。


1
申し訳ありませんが、この答えは無効です。10^ -15の確率で適切機能しない可能性があり、リンクされたメタ投稿で明示的に禁止されています。
-pppery

22

R、60 47 28バイト

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

これは、2つの数値を受け入れて数値を返す名前のない関数オブジェクトです。再帰を使用しません。

xnorがコメントで指摘したように、この問題は単純に2つの数字と1/10の故障確率を持つ幾何学的なランダム変数を追加するものと見なすことができます。

なぜそれが本当ですか?投稿で説明されているように、再帰の観点から考えてください。各反復では、1を追加して再帰する可能性が10%あり、さらに追加することなく関数を終了する可能性が90%あります。各反復は、結果が "add 1、recurse"(失敗)および "exit"(成功)である、独自の独立したベルヌーイ試行です。したがって、失敗の確率は1/10で、成功の確率は9/10です。

一連の独立したベルヌーイ試行を扱う場合、単一の成功を得るために必要な試行の数は幾何分布に従います。この場合、各再帰は1を追加することを意味するため、関数を最終的に終了するとき、基本的に最初の成功の前に発生した失敗の数をカウントしました。つまり、結果のオフセット量は、幾何分布からのランダム変量です。

ここでは、Rの確率分布の組み込みスイートを利用rgeomして、幾何分布からランダムな値を返すuseを使用できます。

ゴルフをしていない:

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

13

Minkolang 0.1419の 11 12バイト

これは「機能」バージョンです。既にスタック上にあると想定しabそれらをポップして、の修正バージョンをプッシュしa+bます。Minkolangの関数に最も近いものは、を使用することですF。これba、飛び出し(a,b)、コードボックスにジャンプします。次に、プログラムカウンターがに達すると、使用されfていた場所Fに戻ります。

(+$01$h`d)xf

これは、完全なプログラムバージョンである15バイトです。(nn入力から2つの数値を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]、ループの2回目になります。そのため+、最初に1が追加されます(同様に、後続のトリップでも)。


これは本当に機能ですか?言語のドキュメントをすばやくスキャンしましたが、関数定義を説明するものが見つかりませんでした。説明に基づくと、コードフラグメントのように見えます。
レトコラディ

@RetoKoradi:このような「コードフラグメント」を独自の行に配置し、0kF(kはいくつかの数字)でジャンプし、最後にfでジャンプできます。これがMinkolangの関数に最も近いものです。
エレンディアスターマン

2
技術的には、「私のCJamコードフラグメントは関数です。中括弧で囲む必要があります」と言っているのではないでしょうか。少なくとも、f文字カウントの最後におそらく含める必要があります(そして、技術的に余分なことを感じている場合は、先行する改行も必要ですが、それは必要ないと思います)。
ドアノブ

1
言語に機能がない場合は、いつでも完全なプログラムを投稿できます。私の理解では、「関数」と言うときは、名前付き関数か、匿名関数(通常は関数変数に割り当てることができる式)でなければなりません。私はかつてこれに似たものをCJamに投稿しましたが、Martinはすぐにそれを呼び出し、関数ではなくコードの断片であると言いました。
レトコラディ

@RetoKoradi:わかりました、わかりました。ドアノブの提案をどう思いますか?
エレンディアスターマン

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チャンス)、increment the number」です。これにより、再帰の必要がなくなります。


8

Javascript 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+b35バイトのための
WallyWest

2
@WallyWest残念ながら、Dateタイムスタンプを使用する確率は正確ではありません。評価trueした場合1、ミリ秒の残りの間は追加し続けるからです。
user81655

幾何分布を試しましたf=(a,b)=>a+b-~~Math.log10(Math.random())が、2バイト長くなります。
ニール

8

MATL14 13 12バイト

is`r.1<tb+w]

これは単なるループメソッドであり、入力(として入力[a b])を追加し、0から1の間の一様な乱数が0.1未満である間、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もう1つの方法は、15バイトの場合、単純なループバージョンですii+`10Yr1=tb+w]
デビッド

実際、ループを短くすることができます!@ThomasKwa、ありがとう!
デビッド

とてもうまくできました!
ルイスメンドー

7

Binary-Encoded Golfical32 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%の確率で加算の結果を出力します。残りの時間は、一番下の行に送信され、最初のセルに1を入れて、追加命令の直前にメイン行に戻ります(北のターン、次に東のターンを使用)。


2
説明を追加できますか?これはとてもクールです。

7

Python、66 65 64 63バイト

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

オンラインで試す

修正と保存されたバイトをSherlock9に感謝します。

別のバイトについてはMathias Ettingerに感謝します。

1バイトのmbomb007に感謝します。




@ASCIIのみ.9>random()floatの不均一な分布のため、Using は10のうち9ではありません
Mego

6

ジュリア、30バイト

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

これは、f2つの数値を受け入れ、同じタイプの数値を返す再帰関数です。どの数値型でも問題なく機能するはずです。

最初に、0と1の間のランダムフロートが0.9より大きいかどうかを確認します。もしそうなら、私たちは少し余分なsomethin 'somethin'で再帰し、そうでなければ我々は単に追加します。


6

TI-BASIC、15バイト

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

これは、入力をからの2要素リストとして受け取りますAns。乱数は未満ですが0.10.5リストへのベクトル化された加算を行います。各要素を0.5増加させると、合計が1増加します。これが最も短いTI-BASICソリューションだと思います。

9バイトのプログラムsum(Ans)-int(log(10randrand、精度が14桁しかないため機能しません。したがって、10 -14未満の数値を与えることはできません。


1
14を追加するには、豚が飛ぶのを見て、地獄が凍るのを見る必要があることに注意してください。そして、あなたが14を追加するまでに、私は私の人生で何かをしたでしょう。
ニックハートリー

5

APL、17バイト

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

これは名前のない二項関数です。

ゴルフをしていない:

{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に、変数をインクリメントするための短い方法を提供して2つの文字を削除してくれてありがとう!


5

Vitsy12 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

Lisp、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、私は、関数は再帰的でなければなりませんので、動作するとは思わない
スラッシュはsudoのrm -rf

表現がとても面倒に見える理由を説明してくれてありがとう。
ニール

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

Mathematica、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:@Megoのおかげで、0.1ではなく.1を書き込み、三項演算子を書き直して2バイト削減

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

編集2:カットされた12バイト、gnu99に続いて、特に明記しない限り、すべての変数はintです。関数の戻り値の型についても同じことが言えます

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

編集: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]、つまり、2つの数値を持つ行ベクトルです。

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

マイクロスクリプト29 21バイト

isi+vzr10!{l1vzr10!}l

Microscript IIの回答を作成しようとしましたが、何らかの理由で追加ループを正しく動作させることができませんでした:(


3

マウス-200241の 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

ゼリー、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ソリューションと同じです。-1アウトゴルファーのエリックに感謝します。

匿名の暗黙の挿入機能。

{⍵+1=?10}⍣=+

オンラインでお試しください!

+ 引数を追加します

{}⍣= 2つの連続したアプリケーションの結果が同じになるまで、次の機能を適用します。

?10 1〜10の範囲のランダムな整数

1= 等しいですか?(つまり、1 / 10 番目のチャンス)

⍵+ 引数を追加します


2つの整数を2つの引数として取り、を削除できます/
エリックアウトゴルファー

@EriktheOutgolferうん。
アダム

2

Perl 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

私のPythonの答えの直接の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未満の場合は増加します)。ただし、整数を使用し、ランダムな整数in [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

falseであるnため、whileループを実行するに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.