反復ダイスローリング


12

入力nが与えられた場合3 <= n <= 25n片面のダイ(範囲内の面)から始めて、次の手順を実行します[1, n]

  1. 現在のnサイドのサイコロをプレイ中に転がした結果をフォームに出力しますkdn: XX結果kはプレイ中のサイコロの数です)。
  2. プレイ中のサイコロの数の倍X以上の場合n/2、サイコロを追加します。それ以外の場合は、ダイを取り外します。
  3. プレイ中のサイコロの数が0またはnに等しい場合、停止します。それ以外の場合は、手順1に進みます。

例の実行(括弧内の出力は説明用であり、必須ではないことに注意してください):

6面:

1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)

9面:

1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)

ルール

  • 出力は正確にformatである必要がありkdn: X、各ロールは改行で区切られます
  • 実際に、複数のサイコロの転がりをシミュレートする必要があります。範囲内のランダムな整数に[1, n]現在プレイ中のサイコロの数を掛けた値を単純に返すことは許可されません。複数のサイコロの出目を正確にシミュレートしないためです。
  • 標準的な抜け穴は禁止されています
  • これはなので、バイト単位の最短回答が勝ちます

リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からリーダーボードを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、スニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


これは紛らわしい。回答の例、お願いします?
Hipe99

例の解答例としては、簡潔です。
Hipe99

編集内容が明確になりました。ありがとう!
Hipe99

16
あなたは必ずあなたの算術は?従来のd6の平均ロールは3.5です。
ピーターテイラー

11
あなたの例のすべての平均は間違っているようだ
edc65

回答:



3

Mathematica、95 89 80文字

For[k=1,0<k<#,If[Print[k,d,#,": ",x=Tr[{1,#}~RandomInteger~k]];x<k/2#,k--,k++]]&

非ゴルフ

For[
  k = 1,
  0 < k < #,
  If[
    Print[k, d, #, ": ", x = Tr[{1, #}~RandomInteger~k]];
    x < k/2 #,
    k--,
    k++
  ]
] &

1
@MartinBüttnerご提案ありがとうございます。Echo残念ながら、一連の入力を行うことはできませんPrint
shrx

ああ、良い点。
マーティンエンダー

3

PHP、164 121 112 113 109バイト

最終版、約束します。Titusの提案を使用して改善:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$y+=$r/$y>$x/2?:-1;$y<$x&&$y?d($x,$y):0;}

編集:フォーマット用に余分なバイトを追加しました。「add / sub」テキストをドロップしたおかげで、三項演算子である可能性があるIFが忘れられていました。

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}

出力は次のようになります。

1d6: 5
2d6: 11
3d6: 8
2d6: 11
3d6: 7
2d6: 4
1d6: 5

編集:@Manatworkのおかげで、私を大いに救ってくれました!新しいバージョンと改善されたバージョン:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x=$r\n";if($r/$y>$x/2)$y++;else$y--;if($y<$x&&$y){d($x,$y);}}

前のエントリ:

function d($x,$y){for($i=0;$i<$y;$i++)($r+=rand(1,$x));$s=$y."d$x=$r, ";if($r/$y>$x/2){$y++;$s.="add";}else{$y--;$s.="sub";}echo $s."\n";if($y<$x&&$y>0){d($x,$y);}}`

ダイスを転がし、これを出力します:

1d6=6, add
2d6=7, add
3d6=11, add
4d6=14, add
5d6=15, sub
4d6=15, add
5d6=18, add

そして、それはこう呼ばれています: d(6, 1);

AddおよびSub接尾辞の表示は必須ですか?これはあなたの質問から明らかではありません。


要件には、「括弧内の出力は説明のためのものであり、必須ではないことに注意してください」と書かれています。このように短いようだ:function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
manatwork

@manatworkありがとう、本当に助けてくれました!
steenbergh

ifは依然として3進数で、1バイトを節約できます。そして、増減をリモデリングすると、2バイト節約できます$y-=$r/$y>$x/2?:-1
タイタス

2

Python 3、125

DSMのおかげで3バイト節約されました。

def x(d):
 import random;c=1
 while 0<c<d:r=sum(map(random.randint,[1]*c,[d]*c));print('%id%i: %i'%(c,d,r));c+=2*(r>=d*c/2)-1

非常にシンプルで、サイコロを振って平均をチェックします。まだここであまり派手なものはありません。
intで呼び出す必要があります。したがって、x(6)次のようなものが生成されます。

1d6: 5
2d6: 10
3d6: 8
2d6: 7
3d6: 11
4d6: 8
3d6: 13
4d6: 19
5d6: 13
4d6: 15
5d6: 22


2

JavaScriptの(ES6)、97の102 106 112バイト

数バイト節約してくれた@ user81655と@Jupotterに感謝します。

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// 102 bytes:
f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=0;++i<=k;)x+=1+Math.random()*n|0}

// Previous attempt, 112 bytes
f=n=>{k=1;while(k&&k!=n){for(x=i=0;i++<=k;)x+=1+~~(Math.random()*n);console.log(k+`d${n}: `+x);k+=x<k*n/2?-1:1}}

デモ

これは、ES6準拠のブラウザーでのみ機能します(現時点では、FirefoxとEdgeが含まれています。おそらく、実験的なJavaScript機能が有効になっているChromeとOperaが含まれます)。

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// Snippet stuff
console.log = x => {
  document.getElementById('O').innerHTML += x + `<br>`;
}

document.getElementById('F').addEventListener('submit', e => {
  document.getElementById('O').innerHTML = ``
  f(document.getElementById('I').valueAsNumber)
})
<form id=F action=# method=get>
  <label>
    Number of faces: 
    <input type=number min=3 max=25 value=9 required id=I>
  </label>
  <button>Play</button>
  
  <div>
    <output id=O></output>
  </div>
</form>


あなたは、変更される可能性whileforして、ループラウンドダウンの|0代わりに~~()、あなたはいくつかのバイトを保存するためのブラケットを取り外すことができるように、いくつかのステートメントを移動します。また、匿名関数(no f=)にすることもできます。103バイト:n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
user81655

@ user81655ありがとう。何らかの理由であなたのバージョンが多くの外部出力を作成したので、私console.logは他のforループに移動しました(あなたよりも1文字多くかかります)。それでも106に下がった
rink.attendant.6

これをテストせずに作成しただけなので、ほとんどの場合はうまくいきました。:)
user81655

あなたは置き換えることによって、一つの文字を得ることができますk&&k!=n比較ですして、条件をk%n!=0
Jupotter

@Jupotterありがとう、k%nさらに良く動作します;)
rink.attendant.6

1

CJam、45バイト

ri:M;{X__{Mmr+}*[X'dM':S5$N]o_+XM*<_+(-:XM%}g

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

かなり文字通り仕様を実装します(数学的に間違った「平均ロール」式を含む)。予想どおり、以下の元のGolfScriptプログラムをCJamに移植すると、組み込みのコマンド名が短くなったため(mroおよびのg代わりにrandputsおよびdo)、バイト数が節約されました。

GolfScript、51バイト

~:&;{1..{&rand+}*[1"d"&": "4$]puts.+1&*<.+(-:1&%}do

これが元のGolfScriptエントリです。注目に値するゴルフのトリックには、数字1を便利に事前に初期化された変数として使用して、転がされるサイコロの現在の数を格納することが含まれます。(代わりにCJamバージョンはX、CJamが値1に初期化するを使用します。)


追伸 タイトルを見て、私はもともとAnyDiceでこれに答えたかった。しかし、それはこの挑戦にとって恐ろしい選択であることが判明し、与えられたようにこの仕様を実装するためにそれを使用することさえ技術的に可能だとは思いません。

問題は、AnyDiceは、サイコロのローリング統計を計算する決定論的プログラムを作成するためのドメイン固有の言語であるということです。ロールの可能な結果を​​検査し、それらに基づいて条件付きロールを実行すること再帰的に可能ですが、実際のランダム性を生成する方法はありません。したがって、AnyDiceでこのサイコロロールのシーケンスをシミュレートできますが、出力として取得できるのは、プロセスが終了するまでのロール数や特定のステップでの結果の分布などの統計だけです。

はいえ、AnyDiceで最も近いのは次のとおりです。

N: 6
K: 1
function: clip X:n { result: X * (X < N) }
function: adjust X:n { result: [clip X + ((XdN)*2 >= X*N)*2-1] * (X > 0) }
loop I over {1..20} {
  output K named "dice in roll [I]"
  output KdN named "outcome of roll [I]"
  K: [adjust K]
}

それは無益な運動のように思えたので、これは特にゴルフのコードではありません。関数名の短縮や不要な空白の削除など、標準的なブレース言語のゴルフトリックは、とにかくゴルフの可能性の大部分を使い果たすはずです。

ここで使用される重要なトリックは:n、AnyDiceで(関数定義で示されているように)数値を期待する関数を呼び出し、代わりにダイ(つまり、確率分布)を渡すと、AnyDiceがすべての可能な関数を自動的に評価することですダイの、および結果を新しいダイに結合します。

以下に、最初の3つのロールの出力のスクリーンショット(棒グラフ形式)を示します。

AnyDiceスクリーンショット

各グラフ中「0」の欄は、打撃ダイスの数に起因し、反復を停止する確率を示している(注いずれか現在のロールの前に、0又はNである。これは以降、停止状態を表現するための便利な方法であることを起こりますもちろん、0dNをローリングすると常に0になります。)


1

R、103バイト

かなり単純な実装。サイコロのロールはによって行われsum(sample(n,i))ます。

i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}

テスト走行

> i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}
1: 9
2: 
Read 1 item
1d9: 9
2d9: 14
3d9: 10
2d9: 14
3d9: 9
2d9: 9
3d9: 12
2d9: 7
1d9: 9
2d9: 11
3d9: 17
4d9: 18
5d9: 25
6d9: 29
7d9: 33
8d9: 43
9d9: 45
> 

1

CoffeeScript、106 99バイト

f=(n,k=1)->(x=k;x+=Math.random()*n|0for[k..0];console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

# Previous attempt, 106 bytes
f=(n,k=1)->(x=i=0;x+=1+Math.random()*n//1while++i<=k;console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

非ゴルフ

f = (n, k = 1) ->
 (x = k
 x += 1 + Math.random() * n | 0 for [k..0]
 console.log k + "d#{n}: " + x
 k += x < k * n / 2 && -1 || 1
 ) while k % n

1

ジュリア、77バイト

n->(N=1;while 0<N<n k=sum(rand(1:n,N));print(N,"d$n: $k
");N+=1-2(2k<N*n)end)

これのほとんどは自明であるはずです-実際の改行は、バイトを保存するためにprint使用printlnするのではなく、文字列で使用されています。1からの間のランダムな整数をrand(1:n,N)生成しNますn


1

ルビー、93 90 82文字

->n{d=s=2
puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}

サンプル実行:

2.1.5 :001 > -->n{d=s=2;puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}[6]
1d6: 5
2d6: 10
3d6: 6
2d6: 5
1d6: 5
2d6: 8
3d6: 15
4d6: 18
5d6: 22

0

QBIC、83バイト(非競合)

:c=a{e=0[1,q|e=e+_rq,a|]?!q$+@d|!+a$+@:|+!e$~e<c/2|q=q-1\q=q+1]c=q*a~q=a|_X]~q=0|_X

説明:

q                    Tracks the number of dice (is implicitly 1 at the start)
:                    Takes input from a CMD line parameter
[1,q|e=e+_rq,a|]     Rolls the dice separately
?!q$+@d|!+a$+@:|+!e$ Prints the roll result (requires an unfortunate amount of casting...)
~e<c/2|q=q-1\q=q+1]  Checks whether to increase or decrease
~q=a|_X]~q=0|_X      Tests the amount of dice and quits on either boundary.

0

PHP、104バイト

for($n=$argv[$k=1];$k&&$k<$n;print$k."d$n: $x\n",$k-=$x<$n*$k/2?:-1)for($x=$i=0;$i++<$k;)$x+=rand(1,$n);

で実行 php -r '<code>' <N>

壊す

for($n=$argv[$k=1];     // import input, init number of dice
    $k&&$k<$n;          // while 0<$k<$n
    print$k."d$n: $x\n",    // 2. print results
    $k-=$x<$n*$k/2?:-1      // 3. remove or add a die
)
    for($x=$i=0;$i++<$k;)   // 1. roll dice separately
        $x+=rand(1,$n);         // sum up results
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.