혼합 주사위 롤의 주파수 분포 다이에서 롤 수를 합산합니다. 예를 들어 1d12

이 도전에 대한 후속 조치

혼합 주사위 세트가 주어지면 모든 롤링의 주파수 분포를 출력하고 각 다이에서 롤 수를 합산합니다.

예를 들어 1d12 + 1d8(롤링 1 12면 다이 및 1 8면 다이)을 고려하십시오. 최대 및 최소 롤은 각각 202롤링과 비슷합니다 2d10(2 10면 주사위). 그러나, 1d12 + 1d8보다 평평 분포 결과 2d10: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1][1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1].

규칙

  • 주파수는 주파수에 해당하는 합계의 순서대로 나열되어야합니다.
  • 주파수를 해당 합계로 레이블링하는 것은 허용되지만 필수는 아닙니다 (요청은 필요한 순서에서 추론 될 수 있으므로).
  • 출력이 언어의 표현 가능한 정수 범위를 초과하는 입력을 처리 할 필요가 없습니다.
  • 선행 또는 후행 0은 허용되지 않습니다. 출력에는 양의 주파수 만 나타나야합니다.
  • 합리적인 형식 (다이스 목록 ( [6, 8, 8]), 주사위 쌍 목록 ( [[1, 6], [2, 8]]) 등) 으로 입력 할 수 있습니다 .
  • 주파수의 GCD가 1이되도록 주파수를 정규화해야합니다 (예 : [1, 2, 3, 2, 1]대신 [2, 4, 6, 4, 2]).
  • 모든 주사위는 최소한 하나의면을 가질 것입니다 (그래서 a d1는 최소입니다).
  • 이것은 이므로 가장 짧은 코드 (바이트)가 이깁니다. 표준 허점 은 평소와 같이 금지되어 있습니다.

테스트 사례

이러한 테스트 케이스가 제공되는 input: output입력은 쌍 목록으로 제공되는 경우, [a, b]대표 a b양면 주사위 (그렇게 [3, 8]지칭 3d8하며 [[1, 12], [1, 8]]지칭 1d12 + 1d8).

[[2, 10]]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[[1, 1], [1, 9]]: [1, 1, 1, 1, 1, 1, 1, 1, 1]
[[1, 12], [1, 8]]: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
[[2, 4], [3, 6]]: [1, 5, 15, 35, 68, 116, 177, 245, 311, 363, 392, 392, 363, 311, 245, 177, 116, 68, 35, 15, 5, 1]
[[1, 3], [2, 13]]: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 1]
[[1, 4], [2, 8], [2, 20]]: [1, 5, 15, 35, 69, 121, 195, 295, 423, 579, 761, 965, 1187, 1423, 1669, 1921, 2176, 2432, 2688, 2944, 3198, 3446, 3682, 3898, 4086, 4238, 4346, 4402, 4402, 4346, 4238, 4086, 3898, 3682, 3446, 3198, 2944, 2688, 2432, 2176, 1921, 1669, 1423, 1187, 965, 761, 579, 423, 295, 195, 121, 69, 35, 15, 5, 1]
[[1, 10], [1, 12], [1, 20], [1, 50]]: [1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 285, 360, 444, 536, 635, 740, 850, 964, 1081, 1200, 1319, 1436, 1550, 1660, 1765, 1864, 1956, 2040, 2115, 2180, 2235, 2280, 2316, 2344, 2365, 2380, 2390, 2396, 2399, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2399, 2396, 2390, 2380, 2365, 2344, 2316, 2280, 2235, 2180, 2115, 2040, 1956, 1864, 1765, 1660, 1550, 1436, 1319, 1200, 1081, 964, 850, 740, 635, 536, 444, 360, 285, 220, 165, 120, 84, 56, 35, 20, 10, 4, 1]



답변

젤리 ,  14  7 바이트

Xcoder 덕분에 -3 바이트 (선행을 피하기 위해 암시 적 범위 사용 R; 이차원적인 데카르트 제품으로 축소를 대체 p/F€하고 바로 그 목적으로 내장 된 데카르트 제품으로 평면화 Œp)

ŒpS€ĠL€

주사위면의 목록을 가져와 증가하는 합의 정규 분포를 반환하는 모나드 링크.

온라인으로 사용해보십시오!

방법?

주사위 “크기”(암시 적으로)의 목록을 통과하여 얼굴 목록으로 만든 다음 해당 목록의 데카르트 곱 (주사위 세트의 가능한 모든 롤)을 가져온 다음 해당 롤을 합산하고 동일한 그룹을 얻습니다. 인덱스 (오름차순) 및 각 그룹의 길이를 사용합니다.

ŒpS€ĠL€ - Link: list of numbers, dice  e.g. [2,5,1,2]
Œp      - Cartisian product (implicit range-ification -> [[1,2],[1,2,3,4,5],[1],[1,2]])
        -                   -> [[1,1,1,1],[1,1,1,2],[1,2,1,1],[1,2,1,2],[1,3,1,1],[1,3,1,2],[1,4,1,1],[1,4,1,2],[1,5,1,1],[1,5,1,2],[2,1,1,1],[2,1,1,2],[2,2,1,1],[2,2,1,2],[2,3,1,1],[2,3,1,2],[2,4,1,1],[2,4,1,2],[2,5,1,1],[2,5,1,2]]
  S€    - sum €ach          -> [4,5,5,6,6,7,7,8,8,9,5,6,6,7,7,8,8,9,9,10]
    Ġ   - group indices     -> [[1],[2,3,11],[4,5,12,13],[6,7,14,15],[8,9,16,17],[10,18,19],[20]]
     L€ - length of €ach    -> [1,3,4,4,4,3,1]

참고 : 최소 주사위를 굴리는 방법은 하나 뿐이며 (각 주사위마다 하나씩 굴림) 롤을 두 번 계산하지 않으므로 GCD 정규화를 수행 할 필요가 없습니다.


답변

MATL , 8 바이트

1i"@:gY+

입력은 (반복 될 수있는) 다이 크기의 배열입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

1      % Push 1
i      % Input: numeric array
"      % For each k in that array
  @    %   Push k
  :    %   Range: gives [1 2 ... k]
  g    %   Convert to logical: gives [1 1 ... 1]
  Y+   %   Convolution, with full size
       % End (implicit). Display (implicit)


답변

껍질 , 7 바이트

mLkΣΠmḣ

입력은 주사위 목록입니다.
온라인으로 사용해보십시오!

설명

mLkΣΠmḣ  Implicit input, say x=[3,3,6].
     mḣ  Map range: [[1,2,3],[1,2,3],[1,2,3,4,5,6]]
    Π    Cartesian product: [[1,1,1],[1,1,2],..,[3,3,6]]
  kΣ     Classify by sum: [[[1,1,1]],[[1,1,2],[1,2,1],[2,1,1]],..,[[3,3,6]]]
mL       Map length: [1,3,6,8,9,9,8,6,3,1]


답변

하스켈 , 54 바이트

1%r=r
n%r=zipWith(+)(r++[0,0..])$0:(n-1)%r
foldr(%)[1]

온라인으로 사용해보십시오!


하스켈 , 63 바이트

f l=[sum[1|t<-mapM(\x->[1..x])l,sum t==k]|k<-[length l..sum l]]

온라인으로 사용해보십시오!


하스켈 , 68 바이트

k%(h:t)=sum$map(%t)[k-h..k-1]
k%_=0^k^2
f l=map(%l)[length l..sum l]

온라인으로 사용해보십시오!


답변

옥타브 , 88 69 58 56 바이트

하스켈 대답 한 바와 같이, 본 사용 예 3 양면의 분포 및 5 면체 두 벡터의 이산 콘벌 루션 사실 [1,1,1][1,1,1,1,1]. 영리한 골프 -11 바이트 가치의 @LuisMendo에 감사드립니다!

function y=f(c);y=1:c;if d=c(2:end);y=conv(~~y,f(d));end

온라인으로 사용해보십시오!

이 제출은 재귀 적 접근을 사용하고 있습니다. 그러나 루프를 사용하면 약간 길어집니다.

function y=f(c);y=1;for k=cellfun(@(x)ones(1,x),c,'Un',0);y=conv(y,k{1});end


답변

하스켈 , 80 78 64 바이트

이 솔루션은 이전의 도전 과제에서 @ Sherlock9 와 거의 동일한 방식으로 마무리되었습니다 . @xnor는 더 짧은 Haskell 솔루션을 가지고 있습니다 !

import Data.List
g x=[1..x]
map length.group.sort.map sum.mapM g

설명:

                              mapM g -- all possible outcomes
                      map sum        -- the sums of all possible outcomes
map length.group.sort                -- count the frequency of each sum

온라인으로 사용해보십시오!

이전 솔루션 :

이것은 @AndersKaseorg 이산 컨볼 루션 함수를 사용하고 있습니다. 여기서 관찰 예 3 양면의 분포 및 5 면체 두 벡터의 이산 콘벌 루션이다이다 [1,1,1]하고 [1,1,1,1,1].

foldl1(#).map(`take`l)
(a:b)#c=zipWith(+)(0:b#c)$map(a*)c++[]#b
_#c=0<$c
l=1:l

온라인으로 사용해보십시오!


답변

Wolfram Language (Mathematica) , 26 바이트

Tally[Tr/@Tuples@Range@#]&

온라인으로 사용해보십시오!

이전 도전에 대한 나의 답변 의 수정 . 이것은 가능한 모든 결과를 생성하고 합산하여 결과를 계산합니다.

재미를 위해로 쓸 수는 Tally@*Total@*Thread@*Tuples@*Range있지만 더 길다.

Wolfram Language (Mathematica) , 41 바이트

CoefficientList[1##&@@((x^#-1)/(x-1)),x]&

온라인으로 사용해보십시오!

이것은 컨볼 루션 기반 접근 방식입니다 (여기서는 함수 생성의 결과를 통해 컨볼 루션을 수행합니다 1+x+x^2+...+x^(N-1). dN을 롤링하기위한 생성 함수입니다. 그런 다음 계수 목록을 가져옵니다). 첫 번째 솔루션은 큰 입력에 실용적이지 않기 때문에 포함시킵니다.