Chuẩn bị để chết?


22

Lý lịch

Một nguồn ennui trong các trò chơi nhập vai trên bàn là xử lý các cuộn có nhiều xúc xắc. Đúc một câu thần chú tan rã có thể là tức thời, nhưng lăn và thêm 40 con xúc xắc chắc chắn là không!

Một số đề xuất để xử lý việc này được thảo luận tại rpg.stackexchange.com . Tuy nhiên, một số trong số họ, chẳng hạn như sử dụng chương trình lăn hoặc xúc xắc trung bình, lấy đi một số niềm vui và cảm giác kiểm soát từ người chơi. Những người khác, chẳng hạn như gieo 4 con xúc xắc và nhân tổng số 10, làm cho kết quả trở nên lung lay hơn nhiều (trong khi trung bình xúc xắc hoạt động theo hướng ngược lại).

Câu hỏi này liên quan đến một phương pháp giảm số lượng xúc xắc mà không thay đổi kết quả trung bình (trung bình) hoặc độ xoáy của nó (phương sai).

Ký hiệu và toán học

Trong câu hỏi này, chúng tôi sẽ sử dụng ký hiệu sau để thể hiện cuộn súc sắc:

  • n d k (ví dụ 40d6) đề cập đến tổng số n cuộn của một khuôn mặt k.
  • n d k * c (ví dụ 4d6 * 10) mô tả nhân kết quả với hằng số c.
  • Chúng tôi cũng có thể thêm các cuộn (ví dụ 4d6 * 10 + 40d6) và hằng số (ví dụ 4d6 + 10).

Đối với một cuộn chết, chúng ta có thể chỉ ra rằng:

  • Có nghĩa là : E [1d k ] = (k + 1) / 2
  • Phương sai : Var (1d k ) = (k - 1) (k + 1) / 12

Sử dụng các thuộc tính cơ bản của giá trị trung bình và phương sai, chúng ta có thể suy luận thêm rằng:

  • Nghĩa là : E [ m d k * a + n d l * b + c ] = am .E [1d k ] + bn . [1d l ] + c
  • Phương sai : Var ( m d k * a + n d l * b + c ] = a ². M .Var (1d k ) + b ². N .Var (1d l )

Bài tập

Cho ba số nguyên n , kr , chương trình của bạn sẽ xuất ra cách xấp xỉ n d k trong hầu hết các cuộn r , với các ràng buộc sau:

  • Các giải pháp nên có cùng giá trị trung bình và phương sai như n d k .
  • Giải pháp nên chứa số lượng cuộn lớn nhất có thể nhỏ hơn hoặc bằng r , vì càng nhiều cuộn tạo ra phân phối mượt mà hơn.
  • Bạn nên hạn chế các giải pháp của mình chỉ sử dụng xúc xắc k , trừ khi bạn nhắm tới Phần thưởng (xem bên dưới).
  • Nếu không có giải pháp nào (vì r quá nhỏ), chương trình sẽ xuất ra chuỗi "TÔI LÀ MỘT THIÊN CHÚA CẢM XÚC CỦA SEXY!".
  • Các tham số được truyền vào dưới dạng một chuỗi được phân tách bằng dấu cách.
  • Bạn có thể giả sử rằng 1 ≤ n 100, 1 ≤ rnk là một trong 4, 6, 8, 10, 12 và 20 (súc sắc tiêu chuẩn được sử dụng trong mặt bàn).
  • Đầu ra phải ở định dạng được mô tả trong Ký hiệu (ví dụ 4d6 * 10 + 5), với các khoảng trắng tùy chọn xung quanh + s nhưng không ở đâu khác. Số nhân đơn vị cũng là tùy chọn: cả 4d6 * 1 và 4d6 đều hợp lệ.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm. Kết quả phải được in thành STDOUT (hoặc thay thế gần nhất) hoặc trả về dưới dạng chuỗi.

Ví dụ

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

Chấm điểm

Mã ngắn nhất sẽ thắng. Quy tắc tiêu chuẩn áp dụng.

Tiền thưởng

-33% (làm tròn xuống trước khi trừ) nếu chương trình của bạn cũng trả về các giải pháp bao gồm xúc xắc hợp lệ khác với k (trong đó các giá trị hợp lệ, như đã đề cập ở trên, là 4, 6, 8, 10, 12 và 20). Nếu bạn chọn làm như vậy, thì bạn phải luôn trả lại các giải pháp đó khi thích hợp và xử lý các giải pháp sử dụng nhiều loại khuôn. Thí dụ:

>> "7 4 3"
3d6+7

6
+1 Đối với tham chiếu OotS. ;) (Vâng và bởi vì đó thực sự là một thử thách thú vị.)
Martin Ender

1
Có thể sử dụng các khả năng $ \ LaTeX $ mới của chúng tôi để đưa ra câu hỏi này?
orlp

2
@UriZarfaty: Tôi đã cập nhật công thức của bạn để sử dụng LaTeX. Hy vọng là ổn. Nếu bạn không thích nó, bạn có thể quay lại bài đăng và nó sẽ trở lại như trước.
Alex A.

1
Tôi đã quay lại chỉnh sửa LaTeX, vì không may, hiện tại nó sẽ bị hủy kích hoạt .
Martin Ender

1
#SadPanda - Tôi nghĩ rằng đây sẽ là một tham chiếu thử thách mã cho "Xin chào. Tên tôi là Inigo Montoya. Bạn đã giết cha tôi. Chuẩn bị chết."
scunliffe

Câu trả lời:


5

GolfScript ( 163 143 133 byte)

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

Bản demo trực tuyến

Khi không trộn các loại xúc xắc, vấn đề giảm xuống biểu thị ndưới dạng tổng không nhiều hơn rbình phương và kkhông liên quan ngoại trừ việc tính hằng số ở cuối. Phần lớn câu trả lời này là kế toán cần thiết để thể hiện kết quả trong định dạng mong muốn: việc tính toán thực tế là ^\?,{^base}%{0\{.*+}/^=},để tìm thấy những yếu tố nhân a, b, vv .; và ^@{-}/@)*.2/để tính hằng số.

Mổ xẻ

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

Con trăn 487 461 452 - 33% = 303 byte

Vì không ai khác đã làm như vậy, đây là một giải pháp xử lý các loại xúc xắc khác nhau. Giống như các giải pháp khác, nó tạo ra một loạt các giải pháp có thể và lọc chúng xuống. Nó sử dụng thực tế là (k + 1) (k-1) = k ^ 2-1 và hai sơ hở trong thông số kỹ thuật (oops!): Việc thiếu lệnh cấm in mẫu dự phòng 0d k * a (giúp tiết kiệm tất cả 5 byte!) và thiếu giới hạn thời gian chạy (nó bị chậm khá nhanh, mặc dù chạy tất cả các ví dụ đã cho).

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

Đối với đầu ra đẹp hơn thêm if x[0]sau "%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!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.