Ölmeye hazırlan?


22

Arka fon

Masa üstü rol yapma oyunlarındaki ennui kaynaklarından biri çok sayıda zar içeren rulolarla uğraşmaktır. Bir Ayrışma büyüsü yapmak anlık olabilir, ancak 40 zar atmak ve bir araya getirmek kesinlikle değildir!

Bu konuyla ilgili bir dizi öneri rpg.stackexchange.com adresinde tartışılmaktadır . Ancak, bir roller programı kullanma veya ortalama bir zar kullanma gibi bazıları, oyuncuların eğlence ve kontrol hissinin bir kısmını uzaklaştırır. 4 zar atmak ve toplamı 10 ile çarpmak gibi diğerleri, sonuçları çok daha çekingen hale getirmektedir (ortalama zar ters yönde etki ederken).

Bu soru, zar döngü sayısını azaltmak için bir yöntem ile ilgilidir olmayan ortalama sonucu (ortalama) ya da onun swinginess (varyans) ya da değiştirilmesi.

Gösterim ve matematik

Bu soruda, zar rulolarını göstermek için aşağıdaki gösterimi kullanacağız:

  • n, d k (örneğin 40d6) k taraflı kalıbın n döngü toplamına değinmektedir.
  • n, d k * c (örneğin, 4D6 * 10) sabit bir c çarpılması açıklanmaktadır.
  • Ayrıca rulolar (örneğin 4d6 * 10 + 40d6) ve sabitler (örneğin 4d6 + 10) ekleyebiliriz.

Tek bir kalıp rulosu için şunu gösterebiliriz:

  • Ortalama : E [1d k ] = (k + 1) / 2
  • Varyans : Var (1d k ) = (k-1) (k + 1) / 12

Ortalama ve varyansın temel özelliklerini kullanarak, şunu da çıkartabiliriz:

  • Ortalama E [ m, D K * bir + n d L * b + c ] = değilim .e [1d k ] + milyar [1d. L ] + C
  • Varyans : Var ( m, D K * bir + n d L * b + c ] = bir . ² m .Var (1d k ) + b ². N .Var (1d l )

Görev

Üç sayı göz önüne alındığında n , k ve r , program çıktı yaklaşan bir yolu olmalı n d k en fazla içinde r aşağıdaki kısıtlamalarla, rulo:

  • Solüsyon aynı ortalama ve varyans sahip olmalıdır n d k .
  • Daha fazla rulo daha yumuşak bir dağılım ürettiğinden, çözelti, r'ye eşit veya daha az mümkün olan en fazla sayıda rulo içermelidir .
  • Çözümlerinizi , Bonus'u hedeflemediğiniz sürece, sadece k taraflı zar kullanmayla sınırlandırmalısınız (aşağıya bakınız).
  • Eğer bir çözüm yoksa ( r çok küçük olduğu gibi), program "Ben SEKSİ AYAKKABI BİR GOD OF WAR!" Dizesini çıkarmalıdır.
  • Parametreler boşlukla ayrılmış tek bir dize olarak iletilir.
  • 1 ≤ n ≤ 100, 1 ≤ olduğunu varsayalım. rn ve k , 4, 6, 8, 10, 12 ve 20 (masa kullanılan standart zar) biridir.
  • Çıktı, Notasyonda açıklanan şekilde (örn. 4d6 * 10 + 5), + s etrafında isteğe bağlı boşluklarla fakat başka hiçbir yerde olmamalıdır. Birim çarpanları da isteğe bağlıdır: 4d6 * 1 ve 4d6'nın her ikisi de geçerlidir.

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı üzerinden girdi alarak bir program veya işlev yazabilirsiniz. Sonuçlar STDOUT'a (ya da en yakın alternatife) basılmalı ya da string olarak döndürülmelidir.

Örnekler

>> "10 6 10"
10d6
>> "10 6 4"
2d6*2+2d6+14
>> "10 6 3"
1d6*3+1d6+21
>> "10 6 2"
1d6*3+1d6+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!

puanlama

En kısa kod kazanır. Standart kurallar geçerlidir.

Bonus

-33% (çıkarma işleminden önce yuvarlanır), eğer programınız ayrıca k dışında bir geçerli zar içeren çözümler de getirirse (yukarıda belirtilen geçerli değerler 4, 6, 8, 10, 12 ve 20'dir). Bunu yapmayı seçerseniz, uygun olduğunda daima bu gibi çözümleri iade etmeli ve çok sayıda kalıp kullanan çözümleri kullanmalısınız. Örnek:

>> "7 4 3"
3d6+7

6
+1 OotS referansı için. ;) (Aslında, çünkü gerçekten çok güzel bir meydan okuma.)
Martin Ender

1
Belki de bu soruyu değiştirmek için yeni $ \ LaTeX $ yeteneklerimizi kullanın.
orlp

2
@UriZarfaty: LaTeX kullanmak için formüllerini güncelledim. Umarım tamamdır. Eğer beğenmediysen, yazıyı geri alabilirsin ve daha önce olduğu gibi geri döner.
Alex A.

1
LaTeX düzenlemesini geri aldım, çünkü ne yazık ki, şimdilik devre dışı bırakılacak .
Martin Ender

1
#SadPanda - Bunun "Merhaba. Benim adım Inigo Montoya. Babamı öldürdün. Ölmeye hazırlan."
scunliffe

Yanıtlar:


5

GolfScript ( 163 143 133 bayt)

~@:^\?,{^base 0-}%{0\{.*+}/^=},.{{,}$-1=..&{[[1$[1$]/,(3$@]'d*+'1/]zip}%^@{-}/@)*.2/\1&'.5'*}{];'I AM A SEXY SHOELESS GOD OF WAR!'}if

Çevrimiçi demo

Zar türleri karıştırılmadığında, sorun karelerden nfazla olmayan bir toplam olarak ifade etmeyi azaltır ve sonunda sabitin hesaplanması dışında önemsizdir. Bu yanıt bir kısmı istenilen formatta sonuç ifade için gerekli defter olup: gerçek hesaplanmasıdır çarpma faktörleri bulmak için , vs .; verk^\?,{^base}%{0\{.*+}/^=},ab^@{-}/@)*.2/ sabiti hesaplamak için.

teşrih

~                # Stack: n k r
@:^\?,{          # Store n in ^, and for 0 to n**r
  ^base 0-       #   convert to base n and remove 0s.
}%               # Stack: k [arrays of up to r values from 1 to n-1]
{0\{.*+}/^=},    # Filter them to arrays whose sum of squares is n,
                 #   i.e. to multipliers which have the right variance
.{               # If any multiplier array passes the filter...
  {,}$-1=        #   Pick one with the greater number of rolls
                 #   Stack: k [multipliers]
  ..&{           #   Map each distinct multiplier a...
    [[           #     Gather in nested array for later zip
      1$[1$]/,(  #       Split a copy of the multipliers around a to count the as
                 #       Let's denote that count as m
                 #       Stack: k [multipliers] a [ [ m
      3$@        #       Copy k and rotate the a inside the nested array
     ]           #       Stack: k [multipliers] [ [m k a]
      'd*+'1/    #       Push an array ['d' '*' '+'] and close nested array
    ]zip         #       Giving [[m 'd'] [k '*'] [a '+']]
                 #       which will be printed as mdk*a+
  }%             #   Stack: k [multipliers] [string representations of dice]
  ^@{-}/@)*      #   Compute (n - sum(multipliers)) * (k + 1)
                 #   That's twice the constant we need to add to fix the mean
  .2/\1&'.5'*    #   And convert it to a renderable form, including .5 if needed
}{               # Otherwise clear the stack and push the error message
  ];'I AM A SEXY SHOELESS GOD OF WAR!'
}if

1

Python, 487 461 452 -% 33 = 303 bayt

Başka hiç kimsenin yapmadığı için, farklı zar türlerini işleyen bir çözüm. Diğer çözüm gibi, bir dizi olası çözüm üretiyor ve bunları filtreliyor. 0d gereksiz şeklinde baskı yasağı olmaması: Bu (k 1 +) (k-1) = k ^ 2-1 ve iki spec yarı boşluklar (! Hop) gerçeğini kullanır k * a (kazandırır 5 baytın tümü!) ve çalışma süresi kısıtlaması eksikliği (verilen tüm örnekleri çalıştırsa da oldukça hızlı bir şekilde yavaşlar).

from itertools import*
N,K,R=map(int,input().split())
S=lambda l:sum([x[0]for x in l])
s=[x for x in product(*[[(n,k,a)for n in range(N*(K**2-1)/((k**2-1)*a**2)+1)]for a in range(1,N+1)for k in[4,6,8,10,12,20]if a**2<=N])if sum([n*(k**2-1)*a**2 for n,k,a in x])==N*K**2-N and S(x)<=R]
if s:s=max(s,key=S);print"+".join(["%sd%s*%s"%x for x in s]+[str(int(N*(K+1)/2.-sum([n*a*(k+1)/2.for n,k,a in s])))])
else:print"I AM A SEXY SHOELESS GOD OF WAR!"

Daha güzel çıktı için if x[0]sonra ekleyin "%sd%s*%s"%x for x in s:

>> "7 4 3"
3d6+7
>> "10 6 3"
1d6*1+1d8*1+1d8*2+18
>> "10 6 2"
1d6*1+1d6*3+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!
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.