죽음을 각오해라?


22

배경

탁상 형 롤 플레잉 게임에서 ennui의 한 소스는 많은 주사위를 포함하는 롤을 다루는 것입니다. 붕해 주문을 시전하는 것은 순간적 일 수 있지만, 40 주사위를 굴 리거나 합치는 것은 확실하지 않습니다!

이를 처리하기위한 여러 가지 제안 은 rpg.stackexchange.com에서 논의됩니다 . 그러나 롤러 프로그램이나 평균 주사위를 사용하는 등의 일부는 플레이어의 재미와 통제력을 일부 제거합니다. 4 개의 주사위를 굴리고 총계에 10을 곱하는 것과 같은 다른 것들은 결과가 훨씬 더 흔들 리게 만듭니다 (평균 주사위는 반대 방향으로 작용합니다).

이 질문 은 평균 결과 (평균) 또는 그 변동성 (변동) 변경 하지 않고 주사위 롤 수를 줄이는 방법에 관한 것 입니다.

표기법과 수학

이 질문에서는 다음과 같은 표기법을 사용하여 주사위 굴림을 나타냅니다.

  • n d k (예를 들어, 40d6)는 k면 다이의 n 롤의 합을 지칭한다.
  • n d k * c (예 : 4d6 * 10)는 결과에 상수 c를 곱한 것을 나타냅니다.
  • 롤 (예 : 4d6 * 10 + 40d6)과 상수 (예 : 4d6 + 10)를 추가 할 수도 있습니다.

단일 다이 롤의 경우 다음을 보여줄 수 있습니다.

  • 평균 : E [1d k ] = (k + 1) / 2
  • 분산 : Var (1d k ) = (k-1) (k + 1) / 12

평균과 분산의 기본 속성을 사용하여 다음을 더 추론 할 수 있습니다.

  • 평균 : E [ m d k * a + n d l * b + c ] = am . E [ 1d k ] + bn . [1d l ] + c
  • 분산 : Var ( m d k * a + n d l * b + c ] = a ². m .Var (1d k ) + b ². n .Var (1d l )

태스크

세 개의 정수 n , kr이 주어지면 프로그램은 다음과 같은 제약 조건으로 최대 r 롤 에서 n d k 를 근사하는 방법을 출력해야합니다 .

  • 해는 n d k 와 동일한 평균과 분산을 가져야합니다 .
  • 더 많은 롤이 더 부드러운 분포를 생성하기 때문에 솔루션은 r 이하 의 가능한 최대 롤 수를 포함해야합니다 .
  • 보너스를 목표로하지 않는 한 k면 주사위 만 사용하도록 솔루션을 제한해야합니다 (아래 참조).
  • 해결책이 없으면 ( r 이 너무 작 으므로 ) 프로그램은 "I AM A SEXY SHOELESS GOD OF WAR!"문자열을 출력해야합니다.
  • 매개 변수는 공백으로 구분 된 단일 문자열로 전달됩니다.
  • 1 ≤ n ≤ 100, 1 ≤ rn 이고 k 가 4, 6, 8, 10, 12 및 20 (정판에서 사용되는 표준 주사위) 중 하나 라고 가정 할 수 있습니다 .
  • 출력은 + s 주위에 선택적 공백이 있지만 다른 곳에는 표시되지 않은 표기법 (예 : 4d6 * 10 + 5) 형식이어야합니다. 단위 승수도 선택 사항입니다. 4d6 * 1 및 4d6 모두 유효합니다.

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을받는 프로그램 또는 함수를 작성할 수 있습니다. 결과는 STDOUT (또는 가장 가까운 대안)으로 인쇄되거나 문자열로 리턴되어야합니다.

>> "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!

채점

가장 짧은 코드가 승리합니다. 표준 규칙이 적용됩니다.

보너스

프로그램이 k 이외의 유효한 주사위를 포함하는 솔루션을 반환하는 경우 -33 % (빼기 전에 내림)- 위에서 언급 한 유효한 값이 4, 6, 8, 10, 12 및 20 인 경우. 그렇게하기로 결정했다면, 적절한 경우 항상 그러한 솔루션을 반환하고 여러 유형의 다이를 사용하는 솔루션을 처리해야합니다. 예:

>> "7 4 3"
3d6+7

6
+1 OotS 참조 용. ;) (실제로 그것은 정말 좋은 도전이기 때문에.)
Martin Ender

1
새로운 $ \ LaTeX $ 기능을 사용하여이 질문을 해결할 수 있습니까?
orlp

2
@ UriZarfaty : LaTeX를 사용하도록 수식을 업데이트했습니다. 괜찮습니다. 마음에 들지 않으면 게시물을 롤백하면 이전 상태로 돌아갑니다.
Alex A.

1
불행히도 지금은 다시 비활성화 되므로 LaTeX 편집을 롤백 했습니다 .
Martin Ender

1
#SadPanda-나는 이것이 "Hello. 내 이름은 이니 고 몬토야입니다. 당신은 아버지를 죽였습니다. 죽을 준비를합니다."
scunliffe

답변:


5

GolfScript ( 163 143 133 바이트)

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

온라인 데모

주사위 종류를 혼합하지 않으면 문제 nr제곱 이하의 합 으로 표현 되는 것으로 줄어들고 k끝의 상수 계산을 제외 하고 는 관련이 없습니다. 이 답변의 대부분이 원하는 형식으로 결과를 표현하는 데 필요한 부기입니다 : 실제 계산은 ^\?,{^base}%{0\{.*+}/^=},곱셈 요인을 찾기 위해 a, b등; 과^@{-}/@)*.2/ 상수를 산출한다.

해부

~                # 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

파이썬, 487 461 452-33 % = 303 바이트

아무도 그렇게하지 않았으므로 여기에 다른 유형의 주사위를 처리하는 솔루션이 있습니다. 다른 솔루션과 마찬가지로 다양한 솔루션을 생성하고 필터링합니다. 0D 중복 형 인쇄에 대한 금지의 부족 :은 (k는 1 +) (K-1)가 = K ^ 2-1 개의 스펙 세미 허점 (! 죄송) 사실 사용 k는 * (저장을 5 바이트 모두!) 및 실행 시간 제한 부족 (주어진 모든 예제를 실행하지만 상당히 느리게 진행됨).

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!"

예쁘게 출력 추가에 대한 if x[0]"%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!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.