Homestuck's Catenative Doomsday Dice Cascader Uygulaması


29

Meydan okuma

Büyük Midnight Crew tarafından saldırıya uğradım ve kendimi savunmak için Catenative Doomsday Dice Cascader'ı çağırmam gerekiyor . Alanım az olduğundan, kodun mümkün olduğunca kısa olmasına ihtiyacım var.

Katener Doomsday Dice Cascader'in algoritması şu şekilde:

İlk olarak, Prime Bubble'daki altı taraflı kalıp atılır ve sonuç bir sonraki adımın kaç yinelemesinin gerçekleşeceğini belirler.

Altı taraflı bir kalıpla başla. Prime Bubble kalıbının rulosu kadar, bir sonraki kalıbın kenar sayısını mevcut kalıbın rulosunun sonucu ile çarpın. Örneğin, altı taraflı kalıbın ilk rulosunda, rulonuz 2 ise, bir sonraki kalıbınızda 6 * 2 = 12 taraf olacaktır.

Amacınız, giriş yapılmayan ve son kalıbın son sonucunu çıkaran bir fonksiyon veya program yazmaktır. Bu , her dilde en düşük bayt sayısı kazanır!

Örnekler

Örnek 1 - (Yukarıdaki bağlantıdan doğrudan alınmıştır):

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.

Örnek 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
Maksimum çıkış nedir? Her rulo maksimum tarafta sonuçlanırsa? Bence 7958661109946400884391936 = ((((((6 ^ 2) ^ 2) ^ 2) ^ 2) ^ 2 = 6 ^ (2 ^ 5) = 6 ^ 32
Kjetil S. 11

6
@KjetilS. Nitekim, ve bu çıktının olasılığı 1 olmalıdır16*Πben=05(62ben)=16x6x62x64x68x616x632=12155416739906037495048372267884096782336
Jonathan Allan

3
Bunun rastgele olması mı gerekiyor? Soru rastgelelik hakkında hiçbir şeyden bahsetmiyor mu?
Buğday Sihirbazı,

10
@ SriotchilismO'Zaic Zar haddeleme, rastgelelik anlamına gelir.
mbomb007

6
@ SriotchilismO'Zaic xkcd.com/221
Neyt

Yanıtlar:



8

Perl 6 , 43 37 bayt

Nwellnhof sayesinde -6 bayt

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

Çevrimiçi deneyin!

Kıyamet günü zar sonucunu döndüren isimsiz kod bloğu.

Açıklama:

{                                   }   # 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 bayt

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

Çevrimiçi deneyin!

FrownyFrog tarafından tespit edilen bir mantık problemi sayesinde +6 bayt

NOT: J'nin niladik fiilleri yoktur. Ancak, bu fiil ne olursa olsun tartışmak olursa olsun aynı şekilde çalışacaktır. TIO örneğinde, ben onu arıyorum 0, ama kullanabilirdim 99ya da ''aynı zamanda.

Nasıl

  • 1+ birini ekle ...
  • [:?n taraflı kalıbın bir tek silindir (taraf okuma 0için n-1sayı burada,) nile tespit edilir ...
  • (*1+?)mevcut bağımsız değişken almak yve rulo ?arasında rastgele bir sayı üretmek için 0ve y-1. 1+yapar 1için y, kapsayıcı. Sonunda, *bir J kancası yaratır, bu da onu ytekrar çarpar .
  • ^: Yukarıdakileri birçok kez yapın ...
  • (?`]) ?6kaç kez tekrar edeceğinizi belirlemek için olan ilk argümanı döndürün. Eğer yuvarlanırsak 0( 1Başbakan Balonundaki bir maddeye karşılık gelir ), argüman değişmeden geçecektir. ]Gösterir 6, değişmemiş, tekrar başlangıç değeri olacaktır (*1+?)nihai rulo için kalıp değerini belirler fiil.
  • @6xsabit fiili ekler 6, böylece her şeye söyleyebiliriz ve xJ, büyük sayılar için ihtiyaç duyduğumuz genişletilmiş tamsayı hesaplamasını kullanmaya zorlar.

in this case 0 executes the previous verb once, 1 twice, etcNeden?
FrownyFrog

çünkü bir hata yaptım :(. yakında
çözecek

Şimdi düzeltildi. Teşekkürler.
Jonah

4

K (oK) , 32 bayt

Çözüm:

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

Çevrimiçi deneyin!

6 ile başlayın ve "1 6" seçin, "1 6" seçerek tekrarlayın:

*|{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'

Yinelemeleri tarama taramasını değiştirerek görebilirsiniz , örn.

(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-> */xand { }/[*a;6,a:1+1?6]->a{ }/6,a:*1+1?6
ngn

4

Jöle , 9 bayt

6X×$5СXX

Pozitif bir tamsayı üreten bir niladik Bağlantı.

Çevrimiçi deneyin!

Bir baytı daha belirgin bir şekilde kaydetmek 6X×$6X’¤¡X

Nasıl?

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]

Güzel. 'Açık' cevabımın ötesine geçmenin bir yolunu düşünmeye çalışıyordum, ama bütün zarları üretmeyi ve ardından rastgele birini seçmeyi düşünmedim.
Nick Kennedy,

Heh, neredeyse o kesin cevabı gönderdiğini özledim!
Jonathan Allan

3

05AB1E , 10 bayt

X6DLΩF*DLΩ

Büyük listeler için yerleşik olan rastgele seçim oldukça yavaş olduğundan, Prime Bubble rulosu örneğin 6 ise zaman aşımına uğrayabilir.

Online Deneyin veya rulo görmek için eklenen baskılar çevrimiçi denemek . (TIO, biraz daha hızlı olduğundan 05AB1E'nin eski sürümünü kullanır.)

Açıklama:

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

Jöle , 9 bayt

6×X$X’$¡X

Çevrimiçi deneyin!

Jonathan Allan'ın cevabı bunun olduğunu iddia ediyor

Bir baytı daha belirgin bir şekilde kaydetmek 6X×$6X’¤¡X

. Aslında, böyle büyük bir değişiklik yapmamız gerekmez. Bu, Jonathan Allan'ın cevabına alternatif bir yaklaşım ve aynı zamanda ilk geçersiz 6-baytım için bir dinlenme yeri. :(



2

Kömür , 16 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

⊞υ⁶

Önceden tanımlanmış listeye 6 basın.

F⊕‽⁶

1'den 6'ya kadar rasgele sayıları tekrarlayın ...

⊞υ⊕‽Πυ

... listeye 1 ile listenin ürünü arasında rastgele bir sayı basın.

I⊟υ

Listeye basılan son numarayı yazınız.

Alternatif yaklaşım, ayrıca 16 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

≔⁶θ

Kenar sayısını 6 olarak ayarlayın.

F‽⁶

0 ile 5 kez rasgele bir sayı tekrarlayın ...

≧×⊕‽θθ

... kenar sayısını 1'den kenar sayısına rastgele bir sayı ile çarpın.

I⊕‽θ

1'den yanlara rasgele bir sayı yazdırın.



2

R , 43 bayt

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

Çevrimiçi deneyin!

kkalıptaki mevcut yüz sayısını takip eder. TOlarak başlatılmış olan gerçeği kullanır 1.

Birkaç şey daha denedim ama bu basit, basit yaklaşımı yenemedim.


1

Jöle , 10 bayt

6×X$6X’¤¡X

Çevrimiçi deneyin!

açıklama

       ¤   | 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 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

Online Deneyin veya adımlarını görmek için ek baskı-hatları ile çevrimiçi denemek .

intjava.math.BigInteger632intlongBigIntegerintBigIntegers

Açıklama:

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’ü yapmayan çözümü, rakip çözümünüz olarak gönderin.
Stackstuck

232int

Bu konuda metada bir şey bulabilecek miyim bir bakalım.
Stackstuck

1
OP, tamsayı boyut limitleri konusunda endişelenmediğini söylüyor. Türünü kullanın int.
Stackstuck

1
@Stackstuck İşlem tamamlandı ve 7 bayt golf oynadı. :)
Kevin Cruijssen

0

PHP , 59 bayt

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

genişletilmiş:

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

Açık etiketi eklemem gerekip gerekmediğinden emin değilim.

Makinemde $s*$rçok büyükse çöküyor , bu yüzden $q>=5bazen yazdırmıyor ... çünkü sayılar çok büyüyor. Bir düzeltme olduğundan emin değilim.


0

Pyth , 14 bayt

uhO=*|Z6GO6hO6

Çevrimiçi deneyin!

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 bayt

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);}}

Çevrimiçi deneyin!

Ben ediyorum oldukça sonsuz tamsayı uzunluğunun varsayım göz önüne alındığında, bu çalıştığından emin biz sizsiniz, burada düşkün. Taşma işlemini gerçekten halletmek zorunda kalırsam, tamamen farklı bir sınıfı elimden almam gerekir.


System.ArgumentOutOfRangeException: 'maxValue' must be greater than zero632intlongBigIntegers

@KevinCruijssen evet, yorumumun amacı bu.
Stackstuck


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.