다중 주사위 롤의 주파수 분포


23

두 개의 양의 정수 a와가 주어지면 단면 다이 타임 b을 구르고 결과를 합산하는 빈도 분포를 출력합니다 .ba

주파수 분포는 주사위 롤의 각 시퀀스가 ​​한 번 발생하는 경우 가능한 각 합계의 빈도를 나열합니다. 따라서 주파수는 합이 정수인 정수입니다 b**a.

규칙

  • 주파수는 주파수에 해당하는 합계의 순서대로 나열되어야합니다.
  • 주파수를 해당 합계로 레이블링하는 것은 허용되지만 필수는 아닙니다 (요청은 필요한 순서에서 추론 될 수 있으므로).
  • 출력이 언어의 표현 가능한 정수 범위를 초과하는 입력을 처리 할 필요가 없습니다.
  • 선행 또는 후행 0은 허용되지 않습니다. 출력에는 양의 주파수 만 나타나야합니다.

테스트 사례

체재: a b: output

1 6: [1, 1, 1, 1, 1, 1]
2 6: [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
3 6: [1, 3, 6, 10, 15, 21, 25, 27, 27, 25, 21, 15, 10, 6, 3, 1]
5 2: [1, 5, 10, 10, 5, 1]
6 4: [1, 6, 21, 56, 120, 216, 336, 456, 546, 580, 546, 456, 336, 216, 120, 56, 21, 6, 1]
10 10: [1, 10, 55, 220, 715, 2002, 5005, 11440, 24310, 48620, 92368, 167860, 293380, 495220, 810040, 1287484, 1992925, 3010150, 4443725, 6420700, 9091270, 12628000, 17223250, 23084500, 30427375, 39466306, 50402935, 63412580, 78629320, 96130540, 115921972, 137924380, 161963065, 187761310, 214938745, 243015388, 271421810, 299515480, 326602870, 351966340, 374894389, 394713550, 410820025, 422709100, 430000450, 432457640, 430000450, 422709100, 410820025, 394713550, 374894389, 351966340, 326602870, 299515480, 271421810, 243015388, 214938745, 187761310, 161963065, 137924380, 115921972, 96130540, 78629320, 63412580, 50402935, 39466306, 30427375, 23084500, 17223250, 12628000, 9091270, 6420700, 4443725, 3010150, 1992925, 1287484, 810040, 495220, 293380, 167860, 92368, 48620, 24310, 11440, 5005, 2002, 715, 220, 55, 10, 1]
5 50: [1, 5, 15, 35, 70, 126, 210, 330, 495, 715, 1001, 1365, 1820, 2380, 3060, 3876, 4845, 5985, 7315, 8855, 10626, 12650, 14950, 17550, 20475, 23751, 27405, 31465, 35960, 40920, 46376, 52360, 58905, 66045, 73815, 82251, 91390, 101270, 111930, 123410, 135751, 148995, 163185, 178365, 194580, 211876, 230300, 249900, 270725, 292825, 316246, 341030, 367215, 394835, 423920, 454496, 486585, 520205, 555370, 592090, 630371, 670215, 711620, 754580, 799085, 845121, 892670, 941710, 992215, 1044155, 1097496, 1152200, 1208225, 1265525, 1324050, 1383746, 1444555, 1506415, 1569260, 1633020, 1697621, 1762985, 1829030, 1895670, 1962815, 2030371, 2098240, 2166320, 2234505, 2302685, 2370746, 2438570, 2506035, 2573015, 2639380, 2704996, 2769725, 2833425, 2895950, 2957150, 3016881, 3075005, 3131390, 3185910, 3238445, 3288881, 3337110, 3383030, 3426545, 3467565, 3506006, 3541790, 3574845, 3605105, 3632510, 3657006, 3678545, 3697085, 3712590, 3725030, 3734381, 3740625, 3743750, 3743750, 3740625, 3734381, 3725030, 3712590, 3697085, 3678545, 3657006, 3632510, 3605105, 3574845, 3541790, 3506006, 3467565, 3426545, 3383030, 3337110, 3288881, 3238445, 3185910, 3131390, 3075005, 3016881, 2957150, 2895950, 2833425, 2769725, 2704996, 2639380, 2573015, 2506035, 2438570, 2370746, 2302685, 2234505, 2166320, 2098240, 2030371, 1962815, 1895670, 1829030, 1762985, 1697621, 1633020, 1569260, 1506415, 1444555, 1383746, 1324050, 1265525, 1208225, 1152200, 1097496, 1044155, 992215, 941710, 892670, 845121, 799085, 754580, 711620, 670215, 630371, 592090, 555370, 520205, 486585, 454496, 423920, 394835, 367215, 341030, 316246, 292825, 270725, 249900, 230300, 211876, 194580, 178365, 163185, 148995, 135751, 123410, 111930, 101270, 91390, 82251, 73815, 66045, 58905, 52360, 46376, 40920, 35960, 31465, 27405, 23751, 20475, 17550, 14950, 12650, 10626, 8855, 7315, 5985, 4845, 3876, 3060, 2380, 1820, 1365, 1001, 715, 495, 330, 210, 126, 70, 35, 15, 5, 1]

b적어도 2 라고 가정 할 수 있습니까 ? (또는하지 않으면 어떻게해야 같은 단면 다이 모양의 합계에 대한 주파수 목록?)
미샤 라브 로프

선행 또는 후행 0을 가질 수 있습니까?
xnor

답변:


9

옥타브 , 38 바이트

@(a,b)round(ifft(fft((a:a*b<a+b)).^a))

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

설명

독립적 인 랜덤 변수를 추가하는 것은 확률 질량 함수 (PMF)를 변화 시키거나 특성 함수 (CF)를 곱하는 것에 해당합니다. 따라서 a독립적으로 동일하게 분포 된 변수 의 합의 CF는 의 제곱으로 올린 단일 변수 의 CF에 의해 주어집니다 a.

CF는 본질적으로 PMF의 푸리에 변환이므로 FFT를 통해 계산할 수 있습니다. 하나의 PMF b양면 다이에 균일하게 1, 2, ... b. 그러나 두 가지 수정이 필요합니다.

  • 1실제 확률 값 ( 1/b) 대신에 사용됩니다 . 이런 식으로 결과는 비정규 화되고 필요에 따라 정수를 포함합니다.
  • FFT 출력에 적절한 크기 ( a*b-a+1)가 있고 FFT에 의해 가정 된 암시 적주기 동작이 결과에 영향을 미치지 않도록 0으로 패딩 해야합니다.

합의 특성 함수를 얻은 후에는 역 FFT를 사용하여 최종 결과를 계산하고 반올림을 적용하여 부동 소수점 부정확성을 수정합니다.

입력을 고려 a=2, b=6. 이 코드 는 크기가 0으로 채워진 a:a*b<a+b벡터로 벡터를 만듭니다 .b=6a*b-a+1

[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

그런 다음 fft(...)제공

[36, -11.8-3.48i, 0.228+0.147i, -0.949-1.09i, 0.147+0.321i, -0.083-0.577i, -0.083+0.577i, 0.147-0.321i, -0.949+1.09i, 0.228-0.147i, -11.8+3.48i]

여기서 sinc 함수를 거의 인식 할 수 있습니다 (직사각형 펄스의 푸리에 변환).

(...).^a각 항목을 들어 올린 a다음 ifft(...)역 FFT 를 가져옵니다.

[1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]

이 경우 결과는 정확히 정수이지만 일반적으로의 순서에 상대적인 오차가있을 수 있으므로 1e-16이것이 round(...)필요한 이유 입니다.


1
정말 감동했습니다!
rahnema1

@ rahnema1 승리를위한 신호 처리!
Luis Mendo

8

매스 매 티카, 29 바이트

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

가능한 모든 주사위 롤을 생성하고 총계를 취한 다음 계산합니다. 각 주파수에는 해당 값이 표시되어 있습니다.

수학, 38 바이트

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

(1+x+x^2+...+x^(a-1))^b의 계수를 확장 하고 가져옵니다 x. 이후 1+x+x^2+...+x^(a-1)단일 다이 롤에 대한 생성 함수이고 제품에 대응하는 회선 - 주사위의 값을 가산 - 결과는 주파수 분포를 준다.


6

하스켈 , 90 79 77 75 바이트

Cartesian 제품 트릭에 대해 Lynn에게 감사합니다 . Funky Computer Man의 많은 Haskell 트릭 덕분에 -11 바이트, 이름 지정에서 -2 바이트, Laikoni 덕분에 -2 바이트 골프 제안은 환영합니다! 온라인으로 사용해보십시오!

import Data.List
g x=[1..x]
a!b=map length$group$sort$map sum$mapM g$b<$g a

언 골프

import Data.List
rangeX x = [1..x]
-- sums of all the rolls of b a-sided dice
diceRolls a b = [sum y | y <- mapM rangeX $ fmap (const b) [1..a]]
-- our dice distribution
distrib a b = [length x | x <- group(sort(diceRolls a b))]

$대신 ()2 바이트를 저장 하십시오 . TIO
밀 마법사




(map length$)=(length<$>)2 바이트
Michael Klein

4

Pyth-10 바이트

직교 곱의 [1, b], a시간, 합산 을 취하고 각 합계 그룹의 길이를 가져 와서 가능한 모든 주사위 조합을 취하십시오 .

lM.gksM^SE

테스트 스위트 .


4

05AB1E , 8 바이트

LIãO{γ€g

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

방법?

LIãO {γ € g-전체 프로그램.

L-범위 [1 ... 입력 # 1]
 I-입력 # 2.
  -데카르트 힘.
   O-합계가있는지도
    {-정렬
     γ-연속적인 동일한 요소를 그룹화합니다.
      € g-각각의 길이를 가져옵니다


4

R , 52 바이트

function(a,b)Re(fft(fft(a:(a*b)<a+b)^a,T)/(a*b-a+1))

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

의 포트 @Luis Mendo의 옥타브 솔루션은 , fft(z, inverse=T)우리가 길이에 의해 분할 그래서 불행하게도, 표준화 역 FFT를 반환하고, 그것은 반환 complex우리는 실제 참여할 수 있도록, 벡터.


잘 연주-어제 cmdscaleI 그림에 대한 회수 :-)
flodel

@flodel 아! 나는 실제로 당신에게 그 현상금을 줄 것입니다 :)
Giuseppe

당신은 농담하지 않았다! 너무 관대합니다! 나는 당신의 답을보고 배우는 것을 좋아합니다. 나는 그것을 빨리 갚을 것입니다!
flodel

3

SageMath, 40 바이트

lambda a,b:reduce(convolution,[[1]*b]*a)

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

convolution두 목록의 이산 컨벌루션을 계산합니다. reduce그것은 주석에 말하는 것을 수행합니다. 의 빈도 분포 인의 [1]*b목록 b 1입니다 1db. s 사본의 [[1]*b]*a중첩 된 목록을 a작성 b 1합니다.


Python 2 + NumPy , 56 바이트

lambda a,b:reduce(numpy.convolve,[[1]*b]*a)
import numpy

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

이 솔루션은 본질적으로 동일하므로 위의 솔루션에 포함했습니다. 이 함수는 Python 목록이 아닌 NumPy 배열을 반환하므로 출력은 약간 다르게 보입니다 print.

numpy.ones((a,b))은 NumPy와 함께 사용할 배열을 만드는 "올바른"방법이므로 대신 사용할 수 [[1]*b]*a있지만 불행히도 더 길다.


3

젤리 , 5 바이트

ṗS€ĠẈ

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

이것은 인수를 역순으로 취합니다.

방법?

ṗS € ĠL €-전체 프로그램 (이진) | 예 : 6, 2

ṗ-데카르트 힘 (암시 적 범위) | [[1, 1], [1, 2], ..., [6, 6]]
 S €-각 합계 | [2, 3, 4, ..., 12]
   Ġ-값별로 인덱스 그룹화 | [[1], [2, 7], [3, 8, 13], ..., [36]]
    L €-각 그룹의 길이 | [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]

대체 솔루션 :

ṗZSĠL€
ṗZSµLƙ
ṗS€µLƙ






1

자바 스크립트 (ES6), 94 바이트

f=(n,m,a=[1],b=[])=>n?[...Array(m)].map((_,i)=>a.map((e,j)=>b[j+=i]=(b[j]|0)+e))&&f(n-1,m,b):a
<div oninput=o.textContent=f(+n.value,+m.value).join`\n`><input id=n type=number min=0 value=0><input id=m type=number min=1 value=1><pre id=o>1

32 비트 정수 오버 플로우로 제한되지만 1 바이트의 비용으로 부동 소수점을 대신 사용할 수 있습니다.


음 ... 이것은 하나의 입력 만받습니다
Herman L

@HermanLauenstein 죄송합니다, 어떻게 든 질문의 일부를 완전히 간과했습니다 ... 곧 고칠 것입니다.
Neil

1

J , 25 24 21 20 바이트

3 :'#/.~,+//y$i.{:y'

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

처음에는 [0..n-1] 목록을 증가시켜 [1..n]을 얻었지만 분명히 필요하지는 않습니다.


좋은 대답입니다. 동일한 바이트 수에 대한 암묵적 버전은 다음과 같습니다 #/.~@,@(+///)@$i.@{:. 좀 더 깎아내어 동사를 좀 더 깎아내는 방법이있을 것 같지만 나는 할 수 없었습니다.
Jonah

@Jonah 당신은 여분이 /+//
FrownyFrog

사실, 네 말이 맞아 그것은 두 가지 방식으로 작동합니다. 솔루션이 바이트를 절약한다고 생각합니다 :)
Jonah

1

자바 스크립트 (ES6), 89 바이트

b=>g=a=>a?(l=[..."0".repeat(b-1),...g(a-1)]).map((_,i)=>eval(l.slice(i,i+b).join`+`)):[1]

카레 구문으로 입력을 역순으로 취합니다. f(b)(a)

f=b=>g=a=>a>0?(l=[..."0".repeat(b-1),...g(a-1)]).map((_,i)=>eval(l.slice(i,i+b).join`+`)):[1]
r=_=>{o.innerText=f(+inb.value)(+ina.value)}
<input id=ina type=number min=0 onchange="r()" value=0>
<input id=inb type=number min=1 onchange="r()" value=1>
<pre id=o></pre>


1

실제로 , 13 12 바이트

Mr. Xcoder 덕분에 -1 바이트. 온라인으로 사용해보십시오!

R∙♂Σ;╗╔⌠╜c⌡M

언 골프

                Implicit input: b, a
R∙              ath Cartesian power of [1..b]
  ♂Σ            Get all the sums of the rolls, call them dice_rolls
    ;╗          Duplicate dice_rolls and save to register 0
      ╔         Push uniquify(dice_rolls)
       ⌠  ⌡M    Map over uniquify(dice_rolls), call the variable i
        ╜         Push dice_rolls from register 0
         c        dice_rolls.count(i)
                Implict return

당신은 필요 @하지 않습니까?
Mr. Xcoder

부수적으로 흥미로운 대안을 찾았습니다.R∙♂Σ╗╜╔⌠╜c⌡M
Mr. Xcoder

1

AWK , 191 바이트

주파수를 세로 열로 출력합니다.

func p(z){for(m in z)S[z[m]]++
for(i=$1;i<=$1*$2;i++)print S[i]}func t(a,b,z,s){if(a){if(R++)for(n in z)for(i=0;i++<b;)s[n,i]=z[n]+i
else for(i=0;i++<b;)s[i]=i
t(--a,b,s)}else p(z)}{t($1,$2)}

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

6 바이트를 더 추가하면 여러 입력 세트가 허용됩니다.

func p(z,S){for(m in z)S[z[m]]++
for(i=$1;i<=$1*$2;i++)print S[i]}func t(a,b,z,s){if(a){if(R++)for(n in z)for(i=0;i++<b;)s[n,i]=z[n]+i
else for(i=0;i++<b;)s[i]=i
t(--a,b,s)}else p(z)}{R=0;t($1,$2)}

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


1

클로저, 86 바이트

#(sort-by key(frequencies(reduce(fn[r i](for[y(range %2)x r](+ x y 1)))[0](range %))))

예를 들면 :

(def f #(...))
(f 5 4)

([5 1] [6 5] [7 15] [8 35] [9 65] [10 101] [11 135] [12 155] [13 155] [14 135] [15 101] [16 65] [17 35] [18 15] [19 5] [20 1])

0

C (gcc) , 142 바이트

i,j,k;int*f(a,b){int*r=malloc(sizeof(int)*(1+a*~-b));r[0]=1;for(i=1;i<=a;i++)for(j=i*~-b;j>=0;j--)for(k=1;k<b&k<=j;k++)r[j]+=r[j-k];return r;}

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


sizeof(int)? 정말?
orlp

@orlp 환경에 따라 다릅니다.
Leaky Nun

2
C 프로그램이 특정 아키텍처를 가정 할 수 있습니다. 하나 이상의 시스템에서 작동하는 한. 또한 8모든 아키텍처에서 작동하지만 전반적으로 약간의 할당이 가능하지만 괜찮습니다.
orlp

r[0]=1;for(i=1;i<=a;i++)for(j=i*~-b;for(i=r[0]=1;i<=a;)for(j=i++*~-b;-2 바이트의 경우 ->
Kevin Cruijssen

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.