2つの6面ダイスの100ロールの合計


14

2つの6面ダイスがあるとします。ペアを100回ロールして、各ペアの合計を計算します。各合計が発生した回数を印刷します。合計がロールされなかった場合、その特定の合計がロールされなかったことを識別するゼロまたは何らかの方法を含める必要があります。

出力例:[3、3、9、11、15、15、15、11、15、7、8、3]

合計がロールされた回数は、合計インデックス-2で表されます。

この例では、合計2回が3回([2-2])、合計3回が3回([3-2])、合計が4回9回([4-2])などでした。オン。個々のサイコロの出目が合計に達することは問題ではありません(5と2は6と1と同じ合計としてカウントされます)

データの読み取り方法を説明する限り、「Uい」出力は問題ありません(末尾のゼロの負荷、余分な出力、データの奇妙な表現方法など)。


2
「各ペアが発生した回数を出力する」または「各合計が発生した回数を出力する」という意味ですか?
エソランジングフルーツ

1
特定の合計が表示されない場合、0リストにaが必要ですか、それとも省略できますか?
グレッグマーティン

1
異なる値を一貫して識別できるようにする必要がありますか、それともカウントだけで十分ですか?
ジョナサンアラン

1
出力がペアの各組み合わせが発生する回数だけである場合、なぜ各ロールの値を合計する必要があるのですか?その合計で何をするつもりですか?「ugい」とはどういう意味ですか?
シャギー

1
extra outputしかし、乱数の無限リストを出力することはできず、ランダムにランダムに出現すると言うことはできませんか?それは標準的な抜け穴iircです。
スティーブン

回答:


5

ゼリー13 12 バイト

³Ḥ6ẋX€+2/ṢŒr

ニラディックリンク。出力形式はのリストのリストです[value, count]

(ゼロロールは、そのようなエントリが出力に存在しないことを意味します。たとえば、[[6, 12], [7, 74], [8, 14]]、6、7、および8の合計のみがロールされたことを識別します。)

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

どうやって?

³Ḥ6ẋX€+2/ṢŒr - Main link: no arguments
³            - 100
 Ḥ           - double = 200
  6          - 6
   ẋ         - repeat -> [6,6,6...,6], length 200
    X€       - random integer from [1,z] for €ach (where z=6 every time)
       2/    - pairwise reduce with:
      +      -   addition (i.e. add up each two)
         Ṣ   - sort
          Œr - run-length encode (list of [value, length] for each run of equal values)


3

05AB1E 21 19バイト

@Emignaのおかげで-2バイト

TÝÌтF6Lã.RO¸ì}{γ€g<

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

TÝÌтF6Lã.RO¸ì}{γ€g<
TÝÌ                   Range from 2 to 12
   тF                 100 times do:
     6L                 Range from 1 to 6
       ã                Cartesian product (creates all possible pairs of 1 and 6)
        .RO             Choose random pair and sum
           ¸ì           Prepend result to initial list
             }        end loop
              {γ€g<   Sort, split on consecutive elements, count and decrement

TÝÌтF6Lã.RO¸ì}{γ€g<2バイト節約します。
エミグナ

@Emigna、ループが短くなるとは思わなかった、ありがとう!
カルソウェラス

2

Mathematica、50バイト

r:=RandomInteger@5
Last/@Tally@Sort@Table[r+r,100]

簡単な実装。合計が達成0されない場合、リストから省略されます。


2

MATL、17バイト

6H100I$Yrs!11:Q=s

出力は、スペースで区切られた11個の数字(そのうちのいくつかは場合によっては0)のリストで、2〜12の各ペアの回数を示します。

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

比較のために、各ペアが平均して表示される理論的な平均回数はとして計算できます6:gtY+36/100*

ロールの数を増やすと、得られた値は理論的な値に近づきます。例えば参照取得し、理論 10000本のロールで値を。



2

Perl 6、30バイト

bag [Z+] (^6).pick xx 100 xx 2

(^6).pick0から5までの乱数です。 xx 100そのような数の100要素のリストを作成します。 xx 2このようなリストを2つ作成します。 [Z+]これらの2つのリストを追加して圧縮し、2ダイスロールの100要素のリストを作成します。最後に、bagそのリストをバッグに入れます。バッグは、多重度を持つコレクションです。REPL出力の例:

bag(1(4), 9(4), 0(4), 4(14), 5(18), 3(9), 10(2), 6(19), 7(13), 2(3), 8(10))

つまり、1、9、および0がそれぞれ4回、4回が14回、などが発生することを意味します。標準の1〜6個のサイコロが生成されます。


ワオ。Perl 6は考慮すべき力です。
ヤコブ

ただし、「合計がロールされなかった場合、その特定の合計がロールされなかったことを識別するゼロまたは何らかの方法を含める必要があります。」バッグソリューションがそれを満たしているように見えません。
ヤコブ

特定の番号が転記されていない場合、その状況は、バッグに番号がないことで識別できます。
ショーン

2

R45 37バイト

Jarko Dubbledamのおかげで-7バイト

s=sample;table(s(6,100,T)+s(6,100,T))

要素と各要素の数のテーブルオブジェクトを返します。発生しなかった値を除外します。

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

古いバージョン:

rle(sort(colSums(matrix(sample(6,200,T),2))))

sample(6,200,T) から200回サンプリング 1:6置換で均一にし、2行の行列を作成し、列を合計し、昇順に並べ替えて実行の長さを計算します。達成されなかったサイコロの合計を除外します。

rleオブジェクトを返します。デフォルトでは、次の形式で印刷されます。

Run Length Encoding
  lengths: int [1:11] 5 6 8 12 12 20 12 11 4 7 ...
  values : num [1:11] 2 3 4 5 6 7 8 9 10 11 ...

どこlengthsカウントがあり、valuesサイコロの合計は。

TIOリンク



1

JavaScript(ES6)、72バイト

「ugい」出力が許可されているように、次は2〜12の各スコアがロールされた回数を含む配列を出力し、追加の89要素が0に設定されます。

_=>(a=Array(100).fill(0)).map(_=>a[g()+g()]++,g=_=>Math.random()*6|0)&&a

f=
_=>(a=Array(100).fill(0)).map(_=>a[g()+g()]++,g=_=>Math.random()*6|0)&&a
o.innerText=f()
<pre id=o>


99や20だけでなく、12だけでなく、100個の要素にするためにバイトを浪費していませんか?
ローハンジュンジュンワラ

@RohanJhunjhunwala、このチャレンジでは2つのサイコロを100ロールする必要があります。
シャギー

ああ、ロールを保存するために100要素の配列を初期化するだけだと思った。
ローハンジュンジュンワラ

1

SILOS、99バイト

i=100
lbla
x=rand*6+rand*6
a=get x
a+1
set x a
i-1
if i a
lblb
c=get b
printInt c
b+1
d=11-b
if d b

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

サイコロを転がし、ヒープの最初の11箇所にサイコロを格納し、各カウンターを印刷してヒープを反復処理します。これは、割り当てキーワードと組み合わせたrandキーワードの最初に記録された使用法の1つです。

ロールのヒストグラムを出力するためにいくつかの変更を加えることができることに注意してください。 enter image description here

残念ながら、オフラインインタープリターから実行する必要があります。

i=4000
lbla
x=rand*6+rand*6
a=get x
a+1
set x a
i-1
if i a
canvas 1100 1000 Output
lblb
c=get b
printInt c
d=c*1
y=1000-d
x=b*100
newObj 0 100 d
moveObj b x y
b+1
d=11-b
if d b
wait 10000

1

Elixir、157118バイト

l=&Enum.random(1..&1)
p=fn(o,s)->y=l.(6)+l.(6)
s=List.update_at(s,y,&(&1+1))
if Enum.sum(s)<100 do s=o.(o,s) end
s end

ゼリーより難しいことを試みました。

説明:

  1. 1から6までの乱数を返す関数を定義します。
  2. 関数を匿名で定義してみましょう yし、ロール合計のある変数にします。
  3. 1を追加して、リスト内の適切な場所を更新します。
  4. 100ロールインしている場合は、終了します。それ以外の場合は、自分自身と更新されたリストを再度渡して自分自身を呼び出します。
  5. 更新された配列を返します。

のように呼び出す必要がありますp.(p,[0,0,0,0,0,0,0,0,0,0,0,0,0])。警告が発生しますが、13個の要素を持つ目的の配列を返します。最初の2個は無視する必要があります。


1

Java 8、104バイト

int[]の周波数を返すラムダ。に割り当てSupplier<int[]>ます。

()->{int o[]=new int[11],i=0;while(i++<100)o[(int)(Math.random()*6)+(int)(Math.random()*6)]++;return o;}

オンラインで試す

ゴルフされていないラムダ

() -> {
    int
        o[] = new int[11],
        i = 0
    ;
    while (i++ < 100)
        o[(int) (Math.random() * 6) + (int) (Math.random() * 6)]++;
    return o;
}

1

q / kdb +、31 28 25バイト

解決:

sum!:[11]=/:sum(2#100)?'6

例:

q)sum!:[11]=/:sum(2#100)?'6
1 3 5 11 16 21 16 9 8 9 1i

説明:

サイコロ100?6を転がし、再びサイコロを転がし、ベクトルを一緒に追加します。次に、各結果が0..10の範囲と一致する場所を確認し、各リストのすべてのtrueを合計します。

sum til[11]=/:sum(2#100)?'6 / ungolfed solution
                 (2#100)    / 2 take 100, gives list (100;100)
                        ?'6 / performs rand on each left-each right, so 100 & 6, 100 & 6
              sum           / add the lists together
    til[11]                 / the range 0..10
           =/:              / apply 'equals?' to each right on left list
sum                         / sum up the results, e.g. how many 1s, 2s, 3s.. 12s

ノート:

「ゴルフ」は、主にスワップアウトされるqのキーワードをk、すなわち、同等eachtil


0

QBIC、45バイト

[100|h=_r1,6|+_r1,6|-2┘g(h)=g(h)+1][0,z|?g(b)

説明:

[100|         FOR a = 1 to 100
h=_r1,6|       set h to a random value between 1-6
 +_r1,6|       + another rnd(1,6) (2, 3 ... 11, 12)
 -2            - 2 (index: 0 ... 10
┘             Syntactic linebreak
g(h)          When using array parenthesis on an undefined array,
              it is interpreted as an array with 10 indexes of all zeroes.           
    =         Of array g, set the value of index h (0 ... 11)
      g(h)+1  to one higher (all indices start out as 0)
              Note that we need to track 11 values. Fortunately, QBasic'set
              empty, 10-sized array has 11 indices, because of base 0 / base 1 ambiguity.
]             NEXT set of dice
[0,z|         FOR b = 0 to 10
?g(b)           PRINT the tracker array

0

APL、14バイト

,∘≢⌸+/?100 2⍴6

左の列が合計を表し、右の列がオカレンスの数を表すテーブルとしてデータを提示します。

説明した

        100 2⍴6  ⍝ create an 2×100 array of 6
       ?         ⍝ roll for each cell from 1 to 6
     +/          ⍝ sum every row
   ⌸            ⍝ for every unique sum
,∘≢              ⍝ get the sum and the number of indexes

前の投稿:

APL、36 31バイト

@Adámのおかげで5バイト節約

(11⍴⍉⌽f)[⍋11⍴⍉f←,∘≢⌸+/?100 2⍴6]

説明

f←,∘≢⌸+/?100 2⍴6
          100 2⍴6    ⍝ create an 2×100 array of 6
         ?           ⍝ roll for each cell from 1 to 6
       +/            ⍝ sum every row
     ⌸              ⍝ for every unique sum
  ,∘≢                ⍝ get the sum and the number of indexes

(11⍴⍉⌽f)[⍋11⍴⍉f]  ⍝ ⍋x returns the indexes of the sorted x in the current x  
                     ⍝ x[y] find the yth elements of x
                     ⍝ x[⍋y] reorders x the same way that would be required to sort y

            11⍴⍉f   ⍝ the column of sums - see below
 11⍴⍉⌽f            ⍝ the column of counts - see below

どのように機能し 11⍴⍉⌽fますか?

⍝ ⌽ - Reverses the array
⍝ ⍉ - Transposes the array

  ⍝   f
 9 14   ⍝ Sum - Occurences
 4  9
 7 17
 8 18
 6 15
 5  7
10  3
11  5
 3  6
 2  2
12  4

  ⍝   ⍉f
 9 4  7  8  6 5 10 11 3 2 12  ⍝ Sum
14 9 17 18 15 7  3  5 6 2  4  ⍝ Occurences

  ⍝   ⍉⌽f
14 9 17 18 15 7  3  5 6 2  4  ⍝ Occurences
 9 4  7  8  6 5 10 11 3 2 12  ⍝ Sum

ステートメントを組み合わせて、オペランドを暗黙的にすることにより、数バイトを節約します。(11⍴⍉⌽f)[⍋11⍴⍉f←,∘⍴⌸+/?100 2⍴6]
Adám17年

申し訳ありませんが、提案を編集中に編集しました。暗黙のオペランドに注意してください。
アダム

ただし、OPは明確な出力形式を許可するため,∘⍴⌸+/?100 2⍴6、発生する合計(つまり、存在しない合計を示す)とその頻度(並べ替えは不要)を一覧表示するので十分です。
アダム

0

> <>、93バイト

00[0[v
v 1\v/4
v 2xxx5
v 3/^\6
>l2(?^+]laa*=?v0[
  /&1+&\ v1&0]<
=?/ :?!\}>:@@:@
oa&0n&}< ^+1

オンライン試すか、魚の遊び場で見る

い出力形式は、改行で区切られた数字のシーケンスです。n番目の数字は、合計がnであった回数を示します。示します。すべての正の整数nに対して、ほとんどの行が0になりますが、永久に印刷されるためbecause いです( TIOリンクは、n後に停止するように変更されます、5バイトのコストで、 = 12のます。

魚の遊び場はかなり遅いです-最大nまで印刷するのに約3分半かかります最高速度で = 12ます-したがってaa*、5行目のを変更して、100の代わりに10組のサイコロを転がすように修正することができますa  (つまり、a2つのスペースが続きます)。

ランダムなサイコロの転がしはこのビットで行われます:

1\v/4
2xxx5
3/^\6

xsがランダムに魚の向きを変えます。それが等しい確率で実装されていると仮定すると、サイコロの結果が対称性による均一な分布であることは明らかです。

魚が100ペアのサイコロを転がしたら、このビットで合計がnであった回数をカウントします(わかりやすくするためにラップを解除し、左上から開始)。

v       /&1+&\
>:@@:@=?/ :?!\}
^   +1oa&0n&}<

nをスタックの先頭に保持し、レジスタを使用してnが出現する回数をカウントします。


0

Javascript 85 75文字

ありがとう、シャギー!

a=[]
for(i=100;i--;)a[o=(f=_=>Math.random()*6|0)()+f()]=(a[o‌​]|0)+1
alert(a)

歴史

85

a={}
f=_=>Math.random()*6
for(i=0;i++<100;)a[o=-~f()-~f()]=(a[o]||0)+1
console.log(a)

このためにいくつかの節約を与える意味を保持しました。ソリューションの非常に高速な75バイトバージョンを次に示しますa=[];for(i=100;i--;)a[o=(f=_=>Math.random()*6|0)()+f()]=(a[o]|0)+1;alert(a)。(注:この例では、生命維持には、節約することも、いずれかのバイトがかかりますが、それはあなたの「golfbag」でそれを用意しておくと便利ですので、それは、あなたのバイトまたは2を保存することができます時間がありますどちらも。)
シャギー

ああ、すごい、ありがとう。便利なトリックがあります!とても興味深いの|0は、「Math.floor()」と「undefinedを0に変換する」ためのゴルフソリューションです。
スティーブベネット



0

K(oK)24 22バイト

解決:

+/(!11)=/:+/(2#100)?'6

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

説明:

k私のqソリューションの「ポート」。評価は右から左に行われるため、チルダを囲む括弧(!

+/(!11)=/:+/(2#100)?'6 / the solution
            (2#100)    / the list (100;100)
                   ?'6 / take 6 from each left/each right (roll the dice twice)
           +/          / sum rolls together
  (!11)                / til, performs range of 0..n-1, thus 0..10
       =/:             / equals each right (bucket the sum of the rolls)
+/                     / sum up to get counts per result

編集:

  • -2バイトで、各左を左に切り替え、各左+を右に切り替えます

0

Pyth、21バイト

V100aY,O6O6)VTlfqsTNY

ロール作成の各ステップを出力し、それぞれの合計0〜10の頻度を個別の行に出力します。


V100aY,O6O6)VTlfqsTNY Full program, no input, outputs to stdout
V100                  For N from 0 to 100
    a ,O6O6           Append a pair of random ints below 6
     Y                To a list Y, initialized to the empty list
           )          Then
            VT        For N from 0 to 10
              f     Y Print Y filtered to only include pairs
                q  N  For which N is equal to
                 sT   The sum of the pair

0

Java(OpenJDK 8)、95バイト

a->{int r[]=new int[11],i=0,d=0;for(;i++<200;)r[d+=Math.random()*6]+=i%2<1?1-(d=0):0;return r;}

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

説明

a->{
  int r[] = new int[11],     // Rolls or result
      i   = 0,               // Iteration
      d   = 0;               // Dice accumulator
  for (;i++<200;)
    r[d+=Math.random()*6] += // Accumulate a new die and start an addition
     i % 2 < 1               // Accumulate up to two dice
       ? 1 - (d = 0)         // If we're at 2 dice, reset the accumulator and add 1
       : 0;                  // If we only have one die, add 0
  return r;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.