একাধিক ডাইস রোলগুলির ফ্রিকোয়েন্সি বিতরণ


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? (বা যদি তা না হয় তবে
মিশা লাভরভ

আমরা কী জিরোকে অগ্রণী বা পিছনে রাখতে পারি?
xnor

উত্তর:


9

অক্টাভা , 38 বাইট

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

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

স্বতন্ত্র এলোমেলো ভেরিয়েবল যুক্ত করা তাদের সম্ভাব্য ভর ফাংশন (পিএমএফ) সংশ্লেষ করা বা তাদের বৈশিষ্ট্যযুক্ত ফাংশন (সিএফ) গুণনের সাথে সম্পর্কিত s সুতরাং aস্বতন্ত্র, অভিন্নরূপে বিতরণ করা ভেরিয়েবলের যোগফলের সিএফ একক ভেরিয়েবলের শক্তিতে উত্পন্ন হয় a

সিএফ হ'ল পিএমএফের ফুরিয়ার রূপান্তর, এবং এফএফটি এর মাধ্যমে গণনা করা যায়। একটি একক এর PMF bপার্শ্বযুক্ত ডাই উপর অভিন্ন হয় 1, 2, ..., b। তবে দুটি পরিবর্তন প্রয়োজন:

  • 1প্রকৃত সম্ভাব্যতার মানগুলির পরিবর্তে ব্যবহৃত হয় 1/b। এইভাবে ফলাফলটি অ-সাধারণীকরণ করা হবে এবং প্রয়োজনীয় হিসাবে পূর্ণসংখ্যা থাকবে।
  • জিরোসের সাথে প্যাডিং প্রয়োজন যাতে FFT আউটপুটটির উপযুক্ত আকার ( a*b-a+1) থাকে এবং এফএফটি দ্বারা অনুমিত অন্তর্নিহিত পর্যায়ক্রমিক আচরণ ফলাফলগুলিকে প্রভাবিত করে না।

একবার যোগফলের বৈশিষ্ট্যযুক্ত কার্যটি প্রাপ্ত হয়ে গেলে, চূড়ান্ত ফলাফলটি গণনা করার জন্য একটি বিপরীতমুখী এফএফটি ব্যবহার করা হয় এবং ভাসমান-পয়েন্টের ভুলগুলি সঠিক করতে গোল করার জন্য প্রয়োগ করা হয়।

উদাহরণ

ইনপুট বিবেচনা করুন 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]

এখানে প্রায় সিনক ফাংশনটি চিনতে পারে (একটি আয়তক্ষেত্রাকার পালসের ফুরিয়ার রূপান্তর)।

(...).^aপ্রতিটি এন্ট্রি উত্থাপন করে aএবং তারপরে ifft(...)বিপরীত FFT নেয়, যা দেয়

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

যদিও এই ক্ষেত্রে ফলাফলগুলি ঠিক পূর্ণসংখ্যার হয়, সাধারণভাবে ক্রমের ক্রমের তুলনামূলক ত্রুটি থাকতে পারে 1e-16, যার কারণে round(...)এটি প্রয়োজন।


1
আমি সত্যিই মুগ্ধ!
rahnema1

@ 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 বাইট সংরক্ষণ করার $পরিবর্তে ব্যবহার করুন ()টিআইও
গম উইজার্ড




(map length$)=(length<$>)দুটি বাইটের জন্য
মাইকেল ক্লিন

4

পাইথ - 10 বাইট

সময়ের কার্টেসিয়ান পণ্য [1, b], aসময়, যোগফল এবং প্রতিটি সমষ্টি গ্রুপের দৈর্ঘ্য অর্জন করে কেবল সমস্ত সম্ভাব্য ডাইস সংমিশ্রণ গ্রহণ করে ।

lM.gksM^SE

টেস্ট স্যুট


4

05 এ বি 1 ই , 8 বাইট

LIãO{γ€g

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

LIãO γ γ € g - সম্পূর্ণ প্রোগ্রাম।

এল - ব্যাপ্তি [1 ... ইনপুট # 1]
 আমি - ইনপুট # 2।
  ã - কার্টেসিয়ান শক্তি
   ও - যোগফল সহ মানচিত্র।
    { - সাজান.
     γ - একটানা সমান উপাদানগুলিকে গ্রুপ করুন।
      । G - প্রত্যেকটির দৈর্ঘ্য পান


4

আর , 52 বাইট

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

এটি অনলাইন চেষ্টা করুন!

@ লুইস মেন্ডোর অক্টাভ সমাধানের একটি বন্দর , fft(z, inverse=T)দুর্ভাগ্যক্রমে অস্বাভাবিক বিপরীত এফএফটি ফিরিয়ে দেয়, সুতরাং আমাদের দৈর্ঘ্য দ্বারা বিভক্ত করতে হবে, এবং এটি একটি complexভেক্টরকে ফিরিয়ে দেয় , তাই আমরা কেবল আসল অংশটি নিই।


ভাল খেলেছে - গতকাল এর cmdscaleচিত্রের জন্য আমার
পেগব্যাক

@ ফ্লোডেল হাহ! আমি আসলে আপনাকে তার জন্য একটি অনুদান প্রদান করতে যাচ্ছি :)
জিউসেপ

আপনি মজা করছিলেন না! আপনার এত উদার! আমি আপনার উত্তরগুলি দেখে (এবং শিখেছি) উপভোগ করছি, আমি এটি দ্রুত ফিরিয়ে দেব!
ফ্লোডেল

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

এটি অনলাইন চেষ্টা করুন!

আমি এই সমাধানটি উপরেরটির সাথে অন্তর্ভুক্ত করেছি, যেহেতু তারা মূলত সমান। নোট করুন যে এই ফাংশনটি পাইমথন তালিকা নয় একটি নম্পপি অ্যারে প্রদান করে, তাই আপনি যদি আউটপুট খানিকটা আলাদা দেখায় print

numpy.ones((a,b))NumPy এর সাথে ব্যবহারের জন্য একটি অ্যারে তৈরি করার "সঠিক" উপায় এবং [[1]*b]*aএটি এর জায়গায় ব্যবহার করা যেতে পারে তবে দুর্ভাগ্যক্রমে এটি দীর্ঘ।


3

জেলি , 5 বাইট

ṗS€ĠẈ

এটি অনলাইন চেষ্টা করুন!

নোট করুন যে এটি যুক্তিগুলি বিপরীত ক্রমে গ্রহণ করে।

কিভাবে?

.S € ĠL € - সম্পূর্ণ প্রোগ্রাম (ডায়াডিক) | উদাহরণ: 6, 2

। - কার্টেসিয়ান শক্তি (অন্তর্নিহিত পরিসীমা সহ) | [[1, 1], [1, 2], ..., [6, 6]]
 এস € - প্রত্যেকের যোগফল [2, 3, 4, ..., 12]
   । - মান অনুসারে গ্রুপ সূচক | [[1], [2, 7], [3, 8, 13], ..., [36]]
    এল € - প্রতিটি গ্রুপের দৈর্ঘ্য | [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 বাইটের ব্যয়ে ফ্লোটগুলি ব্যবহার করা যেতে পারে।


উম্ম ...
হারমান এল

@ হারমানলাউনস্টেইন দুঃখিত, আমি কোনওভাবেই প্রশ্নের সেই অংশটিকে সম্পূর্ণ উপেক্ষা করেছি ... শিগগিরই ঠিক হয়ে যাবে।
নীল

1

জে , 25 24 21 20 বাইট

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

এটি অনলাইন চেষ্টা করুন!

প্রাথমিকভাবে আমি [০.n-1] তালিকাটি বাড়িয়েছি [1..n] তবে দৃশ্যত এটি প্রয়োজনীয় নয়।


চমৎকার উত্তর. এখানে বাইট একই সংখ্যক জন্য একটি মৌন সংস্করণ: #/.~@,@(+///)@$i.@{:। দেখে মনে হচ্ছে ক্রিয়াটি ক্রিয়াঘটিত করার ফলে আরও কিছুটা শেভ করার উপায় থাকতে হবে তবে আমি এটি করতে পারিনি।
জোনাহ

@ জোনাঃ আপনার অতিরিক্ত /আছে+//
ফ্রাউনফ্রাগ

আসলে, আপনি ঠিক বলেছেন। এটি কেবল উভয় উপায়েই কাজ করে। আমি অনুমান করি যে সমাধানটি তখন একটি বাইট সংরক্ষণ করে :)
জোনাহ

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 বাইট

-১ বাইট মিঃ এক্সকোডারকে ধন্যবাদ। এটি অনলাইন চেষ্টা করুন!

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

তোমার দরকার নেই @, তাই না?
মিঃ এক্সকডার 13

পার্শ্ব নোট হিসাবে, আমি একটি আকর্ষণীয় বিকল্প পেয়েছি:R∙♂Σ╗╜╔⌠╜c⌡M
মিস্টার এক্সকোডার

1

এডাব্লুকে , 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;-২ বাইটের জন্য।
কেভিন ক্রুজসেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.