Застосуйте каскадний каскадер кісток кістки досудного дня Homestuck


29

Виклик

Мене піддають нападу великодушних екіпажів серед півночі, і мені потрібно викликати каскадер каскадерів коней досудного дня , щоб захистити себе. Оскільки у мене мало місця, мені потрібно, щоб код був якомога коротшим.

Алгоритм для каскадера какаденічних кубиків Doomsday такий:

По-перше, шість однобічних штампів у 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
Kjetil S.

6
@KjetilS. Дійсно, і ймовірність цього виходу повинна бути16i=05(62i)=16×6×62×64×68×616×632=12155416739906037495048372267884096782336
Джонатан Аллан

3
Це повинно бути випадковим? Питання взагалі нічого не згадує про випадковість?
Пшеничний майстер

10
@ SriotchilismO'Zaic Прокатка кісток передбачає випадковість.
mbomb007

6
@ SriotchilismO'Zaic xkcd.com/221
NEYT

Відповіді:



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+ додати його до ...
  • [:?один рулон n-однобічного штампу (сторони читання 0до n-1), де кількість nвизначається ...
  • (*1+?)взяти поточний аргумент yі прокрутити, ?щоб отримати випадкове число між 0і y-1. 1+робить це 1до y, включно. Нарешті, *створює J-гачок, який помножить це ще yраз.
  • ^: робіть вищезазначене багато разів ...
  • (?`]) ?згорніть початковий аргумент, який полягає в тому 6, щоб визначити, скільки разів повторити. Якщо ми прокрутимо 0(відповідає а 1на Prime Bubble), аргумент пройде без змін. ]Вказує на те, що 6, без змін, буде початкове значення повторюється (*1+?)дієслово , який визначає значення матриці для кінцевого рулону.
  • @6xдодає постійне дієслово 6, так що ми можемо називати його чим завгодно, і xзмушує J використовувати розширені цілочисельні обчислення, які нам потрібні для можливо величезних чисел.

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 виберіть 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
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]

Приємно. Я намагався придумати спосіб виходу за межі своєї "очевидної" відповіді, але не думав генерувати всі кістки, а потім вибирати одну навмання.
Нік Кеннеді

Гей, я пропустив, що ти опублікував майже таку точну відповідь!
Джонатан Аллан

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 до кількості сторін.



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 як ваше конкуруюче рішення.
Стек

232int

Я побачу, чи зможу щось знайти на мета про це.
Стек

1
ОП каже, що не турбуйтеся про цілі обмеження розміру. Використовуйте 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

Піт , 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 zero632intlongBigIntegers

@KevinCruijssen так, у цьому вся суть мого коментаря.
Стек


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.