HomestuckのCatenative Doomsday Dice Cascaderを実装する


29

チャレンジ

ミッドナイトクルーの攻撃を受けており、自分自身を守るために、終末の終末のダイスカスケードを召喚する必要があります。スペースが少ないので、コードをできるだけ短くする必要があります。

Catenative Doomsday Dice Cascaderのアルゴリズムは次のとおりです。

最初に、プライムバブルの6面のダイスが転がり、その結果によって次のステップの反復回数が決まります。

6面ダイスから始めます。プライムバブルダイスのロールと同じ回数、次のダイスのサイドの数に現在のダイスのロールの結果を掛けます。たとえば、6面ダイスの最初のロールであなたのロールが2である場合、次のダイスは6 * 2 = 12面になります。

目標は、入力を受け取らず、最後のダイスの最終結果を出力する関数またはプログラムを作成することです。これはであるため、各言語の最小バイトカウントが優先されます!

例#1(上記のリンクから直接取得):

The Prime Bubble rolls a 6, meaning that the Cascader will iterate six times

#1: We always start with a 6 sided die, and it rolls a 2, so the next die has 6x2=12 sides
#2: The 12 sided die rolls an 8, meaning that the third die has 12x8=96 sides
#3: The 96 sided die rolls a 35, meaning that die 4 has 96x35=3360 sides
#4: The 3360 sided die rolls a 2922, so die 5 has 3360x2922 = 9,817,920 sides
#5: The 9.8 million sided die rolls a 5,101,894, so the final die has 50,089,987,140,480 sides
#6: The 50 trillion sided die rolls a one. Hooray. 
Since the last die rolled gave a 1, your function or program should output 1.

例2

The Prime Bubble rolls a 2, meaning that the Cascader will iterate twice.

#1: We always start with a 6 sided die, and it rolls a 4, so the next die has 6x4 = 24 sides
#2: The 24 sided die rolls a 14

Since the last die rolled gave a 14, your function or program should output 14.

4
最大出力は何ですか?すべてのロールが最大面になる場合は?7958661109946400884391936 =((((6 ^ 2)^ 2)^ 2)^ 2)^ 2 = 6 ^(2 ^ 5)= 6 ^ 32
Kjetil S.

6
@KjetilS。実際、その出力の可能性は1でなければなりません16=0562=16×6×62×64×68×616×632=12155416739906037495048372267884096782336
ジョナサンアラン

3
これはランダムなはずですか?質問はランダム性について何も言及していませんか?
小麦ウィザード

10
@ SriotchilismO'Zaicサイコロの出目はランダム性を意味します。
mbomb007

6
@ SriotchilismO'Zaic xkcd.com/221
ネイト

回答:



8

Perl 6の43の 37バイト

nwellnhofのおかげで-6バイト

{(6,{roll 1..[*] @_:}...*)[1+6.rand]}

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

終末のサイコロの結果を返す匿名コードブロック。

説明:

{                                   }   # Anonymous code block
 (                       )[1+6.rand]    # Take a random number from
                     ...*               # The infinite list of
  6,{roll 1..[*] @_:}                   # Cascading dice values
  6,                                    # Starting from 6
    {roll          :}                   # And choosing a random value from
          1..                           # One to
             [*] @_                     # The product of every value so far


5

J、21バイト

1+[:?(*1+?)^:(?`])@6x

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

FrownyFrogによって発見された論理問題のおかげで+6バイト

注:Jにはniladic動詞はありません。ただし、この動詞は、どの引数を指定しても同じように機能します。TIOの例では、次のように呼び出しています0が、私は使用している可能性が99または''全く同じように。

どうやって

  • 1+ に追加...
  • [:?n辺ダイ(辺が読み出しの単一ロール0n-1)、数nによって決定され...
  • (*1+?)現在の引数を取るyとロール?の間の乱数を生成すること0y-11+それ1y包括的にします。最後に*、Jフックを作成します。yします。再びます。
  • ^: これを何度も繰り返します...
  • (?`]) ?最初の引数であるをロールして、6繰り返す回数を決定します。ロール0する場合(1プライムバブルのa に対応)、引数は変更されずに通過します。]それを示し6、変わらず、繰り返しの開始値になります(*1+?)最終的なロール用口金値を決定する動詞。
  • @6x定数verbをアタッチし6て、何でも呼び出すことができるようにします。また、xJは、おそらく膨大な数に必要な拡張整数計算を使用するように強制します。

in this case 0 executes the previous verb once, 1 twice, etc何故ですか?
FrownyFrog

私はミスを犯したので、:(すぐに修正されます。。
ヨナ

修正されました。ありがとう。
ジョナ

4

K(oK)、32バイト

溶液:

*|{x,1+1?x:(*).x}/[*a;6,a:1+1?6]

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

6から始めて「1 choose 6」、「1 choose 6」回繰り返します:

*|{x,1+1?x:(*).x}/[*a;6,a:1+1?6] / the solution
  {             }/[n;    c     ] / iterate over lambda n times with starting condition c
                            1?6  / 1 choose 6, between 0..5 (returns a list of 1 item)
                          1+     / add 1 (so between 1..6)
                        a:       / store as 'a'
                      6,         / prepend 6, the number of sides of the first dice
                   *a            / we are iterating between 0 and 5 times, take first (*)
           (*).x                 / multi-argument apply (.) multiply (*) to x, e.g. 6*2 => 12
         x:                      / save that as 'x'
       1?                        / 1 choose x, between 0..x-1
     1+                          / add 1 (so between 1..x)
   x,                            / prepend x
*|                               / reverse-first aka 'last'

スキャンの切り替えを繰り返すことで、繰り返しを見ることができます。例えば

(6 3        / 1 choose 6 => 3, so perform 3 iterations
 18 15      / 1 choose (6*3=18) => 15
 270 31     / 1 choose (18*15=270) => 31
 8370 5280) / 1 choose (270*31=8730) => 5280

1
(*).x-> */xおよび{ }/[*a;6,a:1+1?6]->a{ }/6,a:*1+1?6
ngn

4

ゼリー、9 バイト

6X×$5СXX

正の整数を生成するniladicリンク。

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

より明白なバイトを保存する 6X×$6X’¤¡X

どうやって?

6X×$5СXX - Link: no arguments
6         - initialise left argument to 6
    5С   - repeat five times, collecting up as we go: -> a list of 6 possible dice sizes
   $      -   last two links as a monad = f(v):           e.g [6,18,288,4032,1382976,216315425088]
 X        -     random number in [1,v]                     or [6,6,6,6,6,6]
  ×       -     multiply (by v)                            or [6,36,1296,1679616,2821109907456,7958661109946400884391936]
       X  - random choice (since the input is now a list) -> faces (on final die)
        X - random number in [1,faces]

いいね 私は「明白な」答えを超えて移動する方法を考えていましたが、すべてのサイコロを生成してからランダムに選ぶことを考えていませんでした。
ニックケネディ

へえ、私はあなたがほとんどその正確な答えを投稿したことを逃しました!
ジョナサンアラン

3

05AB1E、10 バイト

X6DLΩF*DLΩ

大きなリストに組み込まれたランダムな選択は非常に遅いため、Prime Bubbleロールが6などの場合、タイムアウトになる可能性があります。

オンラインそれを試してみてくださいまたはロールを参照するために追加のプリントをオンラインにしてみてください。(TIOはわずかに高速であるため、05AB1Eのレガシーバージョンを使用します。)

説明:

X           # Push a 1 to the stack
 6          # Push a 6 to the stack
  D         # Push another 6 to the stack
   L        # Pop the top 6, and push a list [1,2,3,4,5,6] to the stack
    Ω       # Pop and push a random item from this list (this is out Prime Bubble roll)
     F      # Loop that many times:
      *     #  Multiply the top two values on the stack
            #  (which is why we had the initial 1 and duplicated 6 before the loop)
       D    #  Duplicate this result
        LΩ  #  Pop and push a random value from its ranged list again
            # (after the loop, output the top of the stack implicitly)

3

ゼリー、9バイト

6×X$X’$¡X

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

ジョナサン・アランの答えは、それが

より明白なバイトを保存する 6X×$6X’¤¡X

。実際、このような大きな変更を加える必要はありません。したがって、これはジョナサンアランの答えに対する代替アプローチであり、また、最初の無効な6バイトの休憩場所でもあります。:(



2

、16バイト

⊞υ⁶F⊕‽⁶⊞υ⊕‽ΠυI⊟υ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

⊞υ⁶

6を事前定義リストにプッシュします。

F⊕‽⁶

1から6までのランダムな回数を繰り返します...

⊞υ⊕‽Πυ

... 1からリストの積の間の乱数をリストにプッシュします。

I⊟υ

リストにプッシュされた最後の番号を出力します。

代替アプローチ、16バイト

≔⁶θF‽⁶≧×⊕‽θθI⊕‽θ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔⁶θ

辺の数を6に設定します。

F‽⁶

0〜5回の乱数を繰り返します...

≧×⊕‽θθ

...辺の数に1から辺の数までの乱数を掛けます。

I⊕‽θ

1から辺の数までの乱数を印刷します。




1

ゼリー、10バイト

6×X$6X’¤¡X

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

説明

       ¤   | Following as a nilad:
    6X     | - A random number between 1 and 6
      ’    | - Decrease by 1 (call this N)
6          | Now, start with 6
   $    ¡  | Repeat the following N times, as a monad
 ×         | - Multiply by:
  X        |   - A random number between 1 and the current total
         X | Finally, generate a random number between 1 and the output of the above loop

1

Ruby、41バイト

r=6;rand(2..7).times{r*=$s=rand 1..r};p$s

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

説明

r=6                                 # Set dice number to 6

rand(2..7).times{               }   # Repeat X times, where X=dice roll+1
                 r*=$s=rand 1..r    # Multiply dice number by a dice roll
                                    # Save the most recent dice roll

p$s                                 # Print last dice roll (this is why
                                    #  we did the last step one extra time)

1

Java 10、214 93 86バイト

v->{int r=6,n=0;for(var d=Math.random()*6;d-->0;n*=Math.random(),r*=++n)n=r;return n;}

オンラインそれを試してみたり、ステップを確認するために、追加の印刷ラインとオンラインでそれを試してみてください

intjava.math.BigInteger632intlongBigIntegerintBigIntegers

説明:

v->{                        // Method with empty unused parameter & integer return-type
  int r=6,                  //  The range in which to roll, starting at 6
      n=0;                  //  The roll itself (which must be initialized, therefor is 0)
  for(var d=Math.random()*6;//  Roll the Prime Bubble Dice
      d-->0                 //  Loop that many times:
      ;                     //    After every iteration:
       n*=Math.random(),    //     Roll a random dice in the range [0, n)
       r*=++n)              //     Increase `n` by 1 first with `++n`, so the range is [1,n]
                            //     And then multiply `r` by `n` for the new range
    n=r;                    //   Set `n` to `r`
  return n;}                //  After the loop, return `n` as result

競合ソリューションとしてBigIntegerを実行しないソリューションを投稿してください。
Stackstuck

232int

これについてメタで何かを見つけることができるかどうかを確認します。
Stackstuck

1
OPは、整数サイズの制限について心配しないでくださいと言います。intタイプを使用します。
スタックスタック

1
@Stackstuck完了し、その過程で7バイトをゴルフしました。:)
ケビンクルーッセン

0

PHP、59バイト

$r=$q=rand(1,$s=6);while($l++<$q)$r=rand(1,$s*=$r);print$r;

拡張:

$r=$q=rand(1,$s=6);
while($l++<$q)$ 
    r=rand(1,$s*=$r);
print$r;

開始タグを含めるかどうかはわかりません。

私のマシンで$s*$rは、大きすぎるとクラッシュする$q>=5ため、時々印刷されません...数字が大きくなるためです。修正点は不明です。


0

Pyth、14バイト

uhO=*|Z6GO6hO6

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

uhO=*|Z6GO6hO6   
         O6      Random number in range [0-6)
u                Perform the following the above number of times...
           hO6   ... with starting value G a random number in range [1-6]:
    *   G          Multiply G with...
     |Z6           The value of Z, or 6 if it's the first time through (Z is 0 at program start)
   =  Z            Assign the above back into Z
  O                Random number in range [0-Z)
 h                 Increment
                 Implicit print result of final iteration

0

C#(.NET Core)、136バイト

class A{static void Main(){var r=new System.Random();int i=r.Next(6),j=6;while(i-->0)j*=1+r.Next(j);System.Console.Write(r.Next(j)+1);}}

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

アイムかなり確か私たちはここが好きだという無限の整数の長さの仮定与えられたこの作品、。実際にオーバーフローを処理する必要がある場合は、まったく異なるクラスを破壊する必要があります。


System.ArgumentOutOfRangeException: 'maxValue' must be greater than zero632intそしてlongあなたが使用する必要がありますので、BigIntegers代わりに。
ケビンクルーッセン

@KevinCruijssenはい、それが私のコメントの要点です。
Stackstuck


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.