एकाधिक पासा रोल की आवृत्ति वितरण


23

दो सकारात्मक पूर्णांकों को देखते हुए aऔर b, एक- bमरने वाले aसमय को रोल करने की आवृत्ति वितरण का उत्पादन करते हैं और परिणामों को जोड़ते हैं ।

एक आवृत्ति वितरण प्रत्येक संभावित योग की आवृत्ति को सूचीबद्ध करता है यदि पासा रोल के प्रत्येक संभव अनुक्रम एक बार होता है। इस प्रकार, आवृत्तियाँ पूर्णांक होती हैं जिनका योग बराबर होता है b**a

नियम

  • उस आवृत्ति के बढ़ते क्रम में आवृत्तियों को सूचीबद्ध किया जाना चाहिए जिसके लिए आवृत्ति मेल खाती है।
  • संगत रकम के साथ आवृत्तियों को लेबल करने की अनुमति है, लेकिन आवश्यक नहीं है (क्योंकि रकम आवश्यक आदेश से अनुमान लगाई जा सकती है)।
  • आपको उन इनपुट्स को हैंडल करने की आवश्यकता नहीं है जहां आउटपुट आपकी भाषा के लिए पूर्णांकों की प्रतिनिधित्व योग्य सीमा से अधिक है।
  • शून्य या अनुगामी शून्य की अनुमति नहीं है। केवल सकारात्मक आवृत्तियों को आउटपुट में दिखाई देना चाहिए।

परीक्षण के मामलों

प्रारूप: 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 है? (या यदि नहीं, तो 1-पक्षीय मरने के योग की आवृत्ति सूची कैसी
मिशा लावरोव

क्या हमारे पास जीरो लीडिंग या ट्रेलिंग है?
xnor

जवाबों:


9

ऑक्टेव , 38 बाइट्स

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

इसे ऑनलाइन आज़माएं!

व्याख्या

स्वतंत्र यादृच्छिक चर जोड़ना उनके संभाव्यता द्रव्यमान कार्यों (PMF) को हल करने या उनके विशिष्ट कार्यों (CF) को गुणा करने से मेल खाता है। इस प्रकार a, स्वतंत्र, समान रूप से वितरित चर के योग का CF शक्ति के लिए उठाए गए एकल चर द्वारा दिया जाता है a

सीएफ मूल रूप से पीएमएफ का फूरियर रूपांतरण है, और इस प्रकार एक एफएफटी के माध्यम से गणना की जा सकती है। एक भी की PMF bपक्षीय मरने पर एक समान है 1, 2, ..., b। हालांकि, दो संशोधनों की आवश्यकता है:

  • 1का उपयोग वास्तविक संभावना मानों ( 1/b) के बजाय किया जाता है । इस तरह से परिणाम डी-सामान्यीकृत हो जाएगा और आवश्यकतानुसार पूर्णांक शामिल होंगे।
  • शून्य के साथ पैडिंग की आवश्यकता है ताकि एफएफटी आउटपुट का उचित आकार ( a*b-a+1) हो और एफएफटी द्वारा ग्रहण किए गए निहित आवधिक व्यवहार परिणामों को प्रभावित न करें।

एक बार योग की विशेषता प्राप्त हो जाने के बाद, अंतिम परिणाम की गणना करने के लिए एक व्युत्क्रम FFT का उपयोग किया जाता है, और फ़्लोटिंग-पॉइंट अशुद्धि के लिए सही करने के लिए गोलाई लगाया जाता है।

उदाहरण

आदानों पर विचार करें a=2, b=6। कोड लोगों के a:a*b<a+bसाथ एक वेक्टर बनाता b=6है, आकार में शून्य-गद्देदार a*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 18

@ rahnema1 जीत के लिए सिग्नल प्रोसेसिंग!
लुइस मेंडो

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 बाइट्स

कार्टनियन उत्पाद चाल के लिए लिन का धन्यवाद । -11 बाइट्स फंकी कंप्यूटर मैन से कई हास्केल ट्रिक्स के लिए धन्यवाद, नामकरण से -2 बाइट्स, लाईकोनी के लिए -2 बाइट्स। गोल्फ सुझावों का स्वागत है! इसे ऑनलाइन आज़माएं!

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

Ungolfed

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<$>)दो बाइट्स के लिए
माइकल क्लेन

4

पायथ - 10 बाइट्स

बस , प्रत्येक राशि समूह की लंबाई [1, b], aसमय, योग और प्राप्त करने के कार्टेसियन उत्पाद को ले कर सभी संभव पासा संयोजन लेता है ।

lM.gksM^SE

टेस्ट सूट


4

05AB1E , 8 बाइट्स

LIãO{γ€g

इसे ऑनलाइन आज़माएं!

कैसे?

LIãO {γ € g - पूर्ण कार्यक्रम।

एल - रेंज [1 ... इनपुट # 1]
 मैं - इनपुट # २
  ã - कार्टेशियन पावर।
   ओ - राशि के साथ नक्शा।
    {- सॉर्ट करें।
     equal - समूह लगातार बराबर तत्व।
      € g - प्रत्येक की लंबाई प्राप्त करें


4

आर , 52 बाइट्स

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

इसे ऑनलाइन आज़माएं!

@Luis मेंडोज़ के ऑक्टेव समाधान का एक बंदरगाह , fft(z, inverse=T)दुर्भाग्य से उलटा एफएफटी लौटाता है, इसलिए हमें लंबाई से विभाजित करना होगा, और यह एक complexवेक्टर लौटाता है , इसलिए हम केवल वास्तविक भाग लेते हैं।


अच्छी तरह से खेला - कल के cmdscaleआई फिगर के लिए
पेबैक

@flodel हह! मैं वास्तव में आपको उस एक के लिए एक इनाम देने जा रहा हूँ :)
Giuseppe

आप मजाक नहीं कर रहे थे! इसलिए आप की उदारता! मुझे आपके उत्तरों को देखकर (और सीखने से) आनंद मिलता है, मैं इसे जल्दी वापस चुकाऊंगा!
फ्लोडेल

3

सेजमैथ, 40 बाइट्स

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

इसे ऑनलाइन आज़माएं

convolutionदो सूचियों के असतत दृढ़ीकरण की गणना करता है। reduceटिन पर दिये गये निर्देशों का पालन करो। [1]*bएस की एक सूची है b 1, की आवृत्ति वितरण 1db[[1]*b]*aकी aप्रतियों की नेस्टेड सूची बनाता है b 1


पायथन 2 + न्यूमपी , 56 बाइट्स

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

इसे ऑनलाइन आज़माएं!

मैंने इस समाधान को उपरोक्त के साथ शामिल किया है, क्योंकि वे अनिवार्य रूप से समतुल्य हैं। ध्यान दें कि यह फ़ंक्शन एक NumPy सरणी देता है और पायथन सूची नहीं, इसलिए यदि आप printइसे बनाते हैं तो आउटपुट थोड़ा अलग दिखता है।

numpy.ones((a,b))NumPy के साथ उपयोग करने के लिए एक सरणी बनाने का "सही" तरीका है, और इस प्रकार इसका उपयोग किया जा सकता है [[1]*b]*a, लेकिन यह दुर्भाग्य से लंबा है।


3

जेली , 5 बाइट्स

ṗS€ĠẈ

इसे ऑनलाइन आज़माएं!

ध्यान दें कि यह तर्कों को उल्टे क्रम में लेता है।

कैसे?

ṗS € €L € - पूर्ण कार्यक्रम (डाइएडिक) | उदाहरण: 6, 2

ian - कार्टेशियन पावर (अंतर्निहित सीमा के साथ) | [[१, १], [१, २], ..., [६, ६]]
 S € - प्रत्येक योग | [२, ३, ४, ..., १२]
   Ices - मूल्यों द्वारा समूह सूचकांक | [[१], [२,,], [३, [, १३], ..., [३६]]
    एल € - प्रत्येक समूह की लंबाई | [१, २, ३, ४, ५, ६, ५, ४, ३, २, १]

वैकल्पिक समाधान:

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




2

परी / जीपी , 28 बाइट्स

a->b->Vec(((x^b-1)/(x-1))^a)

इसे ऑनलाइन आज़माएं!


जहां तक ​​मैं बता सकता हूं, यह सबसे छोटा समाधान है जो निश्चित रूप से प्रदान किए गए परीक्षण मामलों में स्मृति से बाहर नहीं चलता है।
मीशा लावरोव


1

जावास्क्रिप्ट (ईएस 6), 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 बाइट की लागत के बजाय फ़्लोट का उपयोग किया जा सकता है।


उम्म ... यह केवल एक इनपुट लेता है
हरमन एल

@HermanLauenstein क्षमा करें, मैं किसी भी तरह सवाल के उस हिस्से को पूरी तरह से अनदेखा कर देता हूं ... जल्द ही ठीक हो जाएगा।
नील

1

जे , 25 24 21 20 बाइट्स

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

इसे ऑनलाइन आज़माएं!

प्रारंभ में मैंने [1..n-1] सूची पाने के लिए [1..n] वृद्धि की, लेकिन जाहिर है यह आवश्यक नहीं है।


अच्छा जवाब। यहाँ बाइट्स की एक ही संख्या के लिए एक टैसिट संस्करण है #/.~@,@(+///)@$i.@{::। ऐसा लगता है कि इस क्रिया को थोड़ा सा और अधिक हल्का बनाने के लिए एक तरीका होना चाहिए, लेकिन मैं ऐसा करने में सक्षम नहीं था।
योना

@ जोना आपके पास एक अतिरिक्त /है+//
FrownyFrog

दरअसल, आप सही कह रहे हैं। यह सिर्फ दोनों तरीकों से काम करने के लिए होता है। मुझे लगता है कि समाधान एक बाइट बचाता है :)
योना

1

जावास्क्रिप्ट (ईएस 6), 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

वास्तव में , १३ 12 बाइट्स

-1 बाइट मिस्टर एक्सकोडर की बदौलत। इसे ऑनलाइन आज़माएं!

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

Ungolfed

                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

आप की जरूरत नहीं है @, क्या आप?
श्री एक्सकोडर

एक साइड नोट के रूप में, मुझे एक दिलचस्प विकल्प मिला:R∙♂Σ╗╜╔⌠╜c⌡M
मिस्टर एक्सकोडर

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

सी (जीसीसी) , 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 पर्यावरण-निर्भर, आप जानते हैं
लीक नून

2
यह सी प्रोग्राम के लिए एक विशेष वास्तुकला को मानने की अनुमति है। जब तक यह कम से कम एक मशीन पर काम करता है। इसके अलावा, 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 बाइट्स के लिए।
केविन क्रूज़सेन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.