Внедрите в игру Homestuck's Catenative Doiceday Dice Cascader.


29

Вызов

Я нападаю на похищенную Полуночную Команду, и мне нужно вызвать Каскад Судебного Кости Судного Дня , чтобы защитить себя. Поскольку у меня мало места, мне нужно, чтобы код был максимально коротким.

Алгоритм Catenative Domsday Dice Cascader выглядит следующим образом:

Сначала бросается шестигранный кристалл в Prime Bubble, и результат будет определять, сколько итераций следующего шага будет выполнено.

Начните с шестигранного кубика. На столько раз, сколько выпадет кубик Первого Пузыря, умножьте количество сторон на следующем кристалле на результат броска текущего кристалла. Например, если на вашем первом броске шестигранного кубика ваш бросок равен 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
Кжетил С.

6
@KjetilS. Действительно, и вероятность этого вывода должна быть16*Πязнак равно05(62я)знак равно16×6×62×64×68×616×632знак равно12155416739906037495048372267884096782336
Джонатан Аллан

3
Это должно быть случайным? Вопрос вообще ничего не говорит о случайности?
Пшеничный волшебник

10
@ SriotchilismO'Zaic Игра в кости подразумевает случайность.
mbomb007

6
@ SriotchilismO'Zaic xkcd.com/221
Нейт

Ответы:



8

Perl 6 , 43 37 байт

-6 байт благодаря nwellnhof

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

Попробуйте онлайн!

+6 байт благодаря логической проблеме, обнаруженной FrownyFrog

ПРИМЕЧАНИЕ: у J нет ниладических глаголов. Однако этот глагол будет работать одинаково, независимо от того, какой аргумент вы ему дадите. В примере TIO я звоню с этим 0, но я мог бы использовать 99или ''просто так.

как

  • 1+ добавить один к ...
  • [:?один рулон п-сторонний штампа (стороны чтение 0к n-1), где число nопределяется ...
  • (*1+?)возьмите текущий аргумент yи ?выполните бросок, чтобы получить случайное число между 0и y-1. 1+делает это 1до y, включительно. Наконец, *создается J-хук, который умножит это yснова.
  • ^: сделать это много раз ...
  • (?`]) ?бросьте начальный аргумент, который 6должен определить, сколько раз повторить. Если мы бросим 0(соответствует a 1на Prime Bubble), аргумент будет проходить без изменений. ]Указывает на то, что 6, без изменений, будет исходное значение повторяется (*1+?)глагол , который определяет значение матрицы для конечного рулона.
  • @6xприсоединяет константный глагол 6, так что мы можем вызвать его с чем угодно, и xзаставляет J использовать расширенное целочисленное вычисление, которое нам нужно для, возможно, огромных чисел.

in this case 0 executes the previous verb once, 1 twice, etcпочему это?
FrownyFrog

потому что я ошибся :(. скоро исправлю.
Иона

Исправлено сейчас. Спасибо.
Иона

4

K (ок) , 32 байта

Решение:

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

Попробуйте онлайн!

Начните с 6 и «1 выберите 6», итерируйте «1 выберите 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
СПП

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Ω

Случайный выбор, встроенный для больших списков, довольно медленный, поэтому может привести к тайм-ауту, если бросок премьер-пузыря, например, равен 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 до количества сторон.



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

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
ОП говорит, что не беспокойтесь о целочисленных пределах размера. Используйте intтип.
Stackstuck

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 zeroошибку. Максимальный результат может быть , что больше, чем максимальный размер обоих и , поэтому вам придется использовать вместо этого. 632intlongBigIntegers
Кевин Круйссен

@KevinCruijssen да, в этом весь смысл моего комментария.
Stackstuck


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.