Homestuck의 종말 종말 주사위 캐스케이드 구현


29

도전

나는 미드 나잇 선원의 공격을 받고 있으며 자신을 방어하기 위해 종말 종말 주사위 캐스커 더 를 소환해야합니다 . 공간이 부족하기 때문에 코드는 가능한 짧아야합니다.

Catenative Doomsday Dice Cascader의 알고리즘은 다음과 같습니다.

먼저, Prime Bubble의 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나는=05(62나는)=16×6×62×64×68×616×632=12155416739906037495048372267884096782336
Jonathan Allan

3
이것은 무작위로되어 있습니까? 질문은 무작위성에 대해 전혀 언급하지 않습니까?
밀 마법사

10
@ SriotchilismO'Zaic 주사위 롤링은 임의성을 의미합니다.
mbomb007

6
@ SriotchilismO'Zaic xkcd.com/221
Neyt

답변:



8

펄 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에는 닐라 딕 동사가 없습니다. 그러나이 동사는 어떤 주장을하든 상관없이 동일하게 작동합니다. 산화 티타늄의 예에서, 내가 함께 전화 해요 0,하지만 난 사용할 수도 99또는'' 단지뿐만 아니라.

방법

  • 1+ 하나를 추가 ...
  • [:?n 형 면체의 단일 롤 (측면 판독 0n-1수를 여기서,) n에 의해 결정된다 ..
  • (*1+?)현재 인수를 y하고 롤 ?사이의 임의의 숫자를 생성 0하고 y-1. 1+그 수 1y, 포함. 마지막으로 *J 후크를 작성하여 y다시 증가시킵니다.
  • ^: 이 작업을 여러 번 수행하십시오 ...
  • (?`]) ?6반복 할 횟수를 결정하기 위해 초기 인수 인을 굴 립니다. 롤링하면 0( 1프라임 버블 의 에 해당 ) 인수는 변경되지 않습니다. 는 변경되지 않은 최종 롤의 다이 값을 결정하는 반복 동사 의 시작 값 이 ]됨을 나타냅니다 .6(*1+?)
  • @6x상수 동사를 첨부하여 6무엇이든 호출 할 수 있으며 xJ는 가능한 큰 숫자에 필요한 확장 정수 계산을 사용합니다.

in this case 0 executes the previous verb once, 1 twice, etc왜 그렇습니까?
FrownyFrog

내가 실수했기 때문에 :(. 곧 고칠 것입니다.
Jonah

지금 수정했습니다. 감사.
요나

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

양의 정수를 생성하는 닐라 딕 링크.

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

보다 분명한 바이트 저장 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]

좋은. 나는 '명백한'답변을 넘어서서 모든 주사위를 생성하고 무작위로 하나를 선택하는 것을 생각하지 않았습니다.
닉 케네디

Heh, 나는 당신이 거의 정확한 답을 올렸다는 것을 놓쳤다!
조나단 앨런

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)



2

, 16 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

⊞υ⁶

미리 정의 된 목록으로 6을 누릅니다.

F⊕‽⁶

1에서 6까지 임의의 횟수를 반복하십시오.

⊞υ⊕‽Πυ

... 1과 목록의 곱 사이의 임의의 숫자를 목록으로 푸시하십시오.

I⊟υ

목록에 마지막으로 누른 숫자를 출력합니다.

대체 접근 방식, 16 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔⁶θ

면 수를 6으로 설정하십시오.

F‽⁶

0과 5 사이의 난수를 반복하십시오 ...

≧×⊕‽θθ

... 변의 수에 1에서 변의 수까지의 난수를 곱하십시오.

I⊕‽θ

1부터 변까지의 난수를 인쇄하십시오.



2

R , 43 바이트

s=sample
for(i in 1:s(k<-6))T=s(k<-k*T,1)
T

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

k다이의 현재면 수를 추적합니다. T로 초기화 된 사실을 사용합니다 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

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

자바 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;}

온라인으로 시도 하거나 단계를 참조하십시오 추가 인쇄 라인을 온라인으로보십시오 .

int대신 -128 바이트를 사용 합니다 java.math.BigInteger.632가장 큰 결과는 intnor 안에 들어 가지 않기 long때문에 BigInteger처음에 사용 된 것입니다. OP는 int무한대 로 사용 한다고 가정하여 125 바이트 이상을 절약했습니다. :) ( 여기서는 이전 214 바이트 버전 BigIntegers입니다. )

설명:

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를 수행하지 않는 솔루션을 경쟁 솔루션으로 게시하십시오.
Stack16

@Stackstuck OP가 귀하의 의견에 대한 답변을 기다립니다. 스스로 확인하려고했습니다. OP가 기본 최대 정수 크기 (일반적으로232그래서 int자바 모두와 .NET C #).
케빈 크루이 ssen

메타에 관한 내용을 찾을 수 있는지 살펴 보겠습니다.
Stackstuck

1
OP는 정수 크기 제한에 대해 걱정하지 않는다고 말합니다. int유형을 사용하십시오 .
Stackstuck

1
@Stackstuck 완료하고 프로세스에서 7 바이트를 기록했습니다. :)
Kevin Cruijssen

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 코어) 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 zero오류가 발생할 수 있습니다 . 최대 결과는632, 이는 모두의 최대 크기보다 큰 intlong사용해야합니다, 그래서 BigIntegers대신.
케빈 크루이 ssen

@KevinCruijssen 예, 그것은 내 의견의 요점입니다.
스택 스틱


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