ইটেরেটেড ডাইস রোলিং


12

একটি ইনপুট দেওয়া হয়েছে nযেখানে , একতরফা ডাই (রেঞ্জের মুখগুলি , অন্তর্ভুক্ত) 3 <= n <= 25দিয়ে শুরু করে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন :n[1, n]

  1. nখেলায় বর্তমান- পাশের ডাইস ঘূর্ণায়নের ফলাফলটি মুদ্রণ করুন kdn: X( ফর্মটি যেখানে Xফলাফল এবং kখেলায় পাশার সংখ্যা)।
  2. তাহলে Xএর চেয়ে বড় বা সমান n/2বার খেলার মধ্যে পাশা সংখ্যা, একটি ডাই যোগ করুন। অন্যথায়, একটি ডাই সরান।
  3. খেলায় পাশা সংখ্যার সমান হলে 0বা nবন্ধ করুন। অন্যথায়, পদক্ষেপ 1 এ যান।

উদাহরণ রান করে (নোট করুন যে বন্ধনীতে আউটপুট ব্যাখ্যা করার জন্য এবং প্রয়োজনীয় নয়):

6-পক্ষ:

1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)

9-পক্ষ:

1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)

বিধি

  • আউটপুটগুলি অবশ্যই kdn: Xপ্রতিটি রোলকে পৃথক করে নতুন লাইনের সাথে ফর্ম্যাটে থাকতে হবে
  • আপনি অবশ্যই একাধিক ডাইস ঘূর্ণায়মান অনুকরণ করতে হবে; কেবলমাত্র [1, n]খেলায় বর্তমানে চালকের সংখ্যা দ্বারা গুণিত পরিসীমা (অন্তর্ভুক্ত) এ এলোমেলো পূর্ণসংখ্যার ফিরে আসার অনুমতি নেই, কারণ এটি একাধিক ডাইস রোলিংয়ের সঠিকভাবে অনুকরণ করে না।
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ
  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর ins

লিডারবোর্ড

এই পোস্টের নীচে স্ট্যাক স্নিপেট উত্তরগুলি থেকে লিডারবোর্ড তৈরি করে) ক) ভাষা প্রতি সংক্ষিপ্ত সমাধানের তালিকা হিসাবে এবং খ) সামগ্রিক লিডারবোর্ড হিসাবে।

আপনার উত্তরটি প্রদর্শিত হয়েছে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেমপ্লেটটি ব্যবহার করে আপনার উত্তরটি শিরোনাম দিয়ে শুরু করুন:

## Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

## Ruby, <s>104</s> <s>101</s> 96 bytes

যদি আপনি নিজের শিরোনামে একাধিক সংখ্যা অন্তর্ভুক্ত করতে চান (যেমন আপনার স্কোর দুটি ফাইলের যোগফল বা আপনি আলাদাভাবে দোভাষী পতাকা দণ্ডের তালিকা করতে চান), নিশ্চিত করুন যে আসল স্কোরটি শিরোনামের শেষ সংখ্যা:

## Perl, 43 + 2 (-p flag) = 45 bytes

আপনি ভাষাটির নামটিকে একটি লিঙ্কও তৈরি করতে পারেন যা স্নিপেটে প্রদর্শিত হবে:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


আমি এই বিভ্রান্তিকর। উদাহরণস্বরূপ উত্তর, দয়া করে?
হিপ 99

উদাহরণ উত্তর , যেমন উদাহরণ বাহুল্যবর্জিত হয়।
হিপ 99

আপনার সম্পাদনা স্পষ্ট হয়েছে। ধন্যবাদ!
হিপ 99

16
আপনি কি আপনার পাটিগণিত সম্পর্কে নিশ্চিত ? একটি প্রচলিত ডি 6 এর গড় রোল 3.5 থাকে।
পিটার টেলর

11
আপনার উদাহরণগুলিতে সমস্ত গড় ভুল বলে মনে হচ্ছে
edc65

উত্তর:



3

গণিত, 95 89 80 টি অক্ষর

For[k=1,0<k<#,If[Print[k,d,#,": ",x=Tr[{1,#}~RandomInteger~k]];x<k/2#,k--,k++]]&

Ungolfed

For[
  k = 1,
  0 < k < #,
  If[
    Print[k, d, #, ": ", x = Tr[{1, #}~RandomInteger~k]];
    x < k/2 #,
    k--,
    k++
  ]
] &

1
@ মার্টিনব্যাটনার আপনার পরামর্শের জন্য ধন্যবাদ। Echoদুর্ভাগ্যক্রমে ইনপুটগুলির মতো ক্রম নিতে পারে না Print
shx

ওহ, ভাল পয়েন্ট।
মার্টিন ইন্ডার

3

পিএইচপি, 164 121 112 113 109 বাইট

চূড়ান্ত সংস্করণ, আমি প্রতিশ্রুতি। তিতের পরামর্শ ব্যবহার করে উন্নত:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$y+=$r/$y>$x/2?:-1;$y<$x&&$y?d($x,$y):0;}

সম্পাদনা: বিন্যাসের জন্য একটি অতিরিক্ত বাইট যুক্ত করা হয়েছে। ভুলে গেছেন সেখানে কোনও আইএফ আছে যে, "অ্যাড / সাব" পাঠ্যটি বাদ দেওয়ার জন্য ধন্যবাদ, কোনও ত্রিনিরি অপারেটর হতে পারত:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}

আউটপুট এখন দেখাচ্ছে:

1d6: 5
2d6: 11
3d6: 8
2d6: 11
3d6: 7
2d6: 4
1d6: 5

সম্পাদনা: @ মনটওয়ার্ককে ধন্যবাদ, আমাকে অনেক বাঁচায়! নতুন এবং ছাপানো সংস্করণ:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x=$r\n";if($r/$y>$x/2)$y++;else$y--;if($y<$x&&$y){d($x,$y);}}

পূর্ববর্তী প্রবেশ:

function d($x,$y){for($i=0;$i<$y;$i++)($r+=rand(1,$x));$s=$y."d$x=$r, ";if($r/$y>$x/2){$y++;$s.="add";}else{$y--;$s.="sub";}echo $s."\n";if($y<$x&&$y>0){d($x,$y);}}`

পৃথক রোল মারা যায়, ফলস্বরূপ:

1d6=6, add
2d6=7, add
3d6=11, add
4d6=14, add
5d6=15, sub
4d6=15, add
5d6=18, add

এবং এটি এইভাবে বলা হয়: d(6, 1);

Addএবং Subপ্রত্যয়টি প্রদর্শন করা কি বাধ্যতামূলক? এটি আপনার প্রশ্ন থেকে অস্পষ্ট।


প্রয়োজনীয়তাটি বলেছে "নোট করুন যে বন্ধনীতে আউটপুট ব্যাখ্যা করার জন্য এবং প্রয়োজনীয় নয়"। এই function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
পথটি

@ মান্যাটওয়ার্ক ধন্যবাদ, আপনি সত্যিই অনেক সাহায্য করেছেন!
স্টেইনবার্গ

যদি এটি এখনও একটি বাইন্ট সংরক্ষণ করে, একটি বার্ষিকী হতে পারে। এবং বৃদ্ধি / হ্রাস পুনর্নির্মাণ দুটি বাইট সংরক্ষণ করতে পারে:$y-=$r/$y>$x/2?:-1
টাইটাস

2

পাইথন 3, 125

ডিএসএমকে 3 টি বাইট সংরক্ষণ করা হয়েছে।

def x(d):
 import random;c=1
 while 0<c<d:r=sum(map(random.randint,[1]*c,[d]*c));print('%id%i: %i'%(c,d,r));c+=2*(r>=d*c/2)-1

খুব সহজ, একগুচ্ছ ডাইস রোল করে দেয় এবং গড় পরীক্ষা করে। এখানে এখনও খুব অভিনব কিছু।
এটি একটি int সঙ্গে কল করা প্রয়োজন। সুতরাং, x(6)এই জাতীয় কিছু উত্পাদন করবে:

1d6: 5
2d6: 10
3d6: 8
2d6: 7
3d6: 11
4d6: 8
3d6: 13
4d6: 19
5d6: 13
4d6: 15
5d6: 22


2

জাভাস্ক্রিপ্ট (ES6), 97 102 106 112 বাইট

আমাকে কয়েকটা বাইট সংরক্ষণ করার জন্য @ ব্যবহারকারী 81655 এবং @ জপোটারকে ধন্যবাদ।

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// 102 bytes:
f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=0;++i<=k;)x+=1+Math.random()*n|0}

// Previous attempt, 112 bytes
f=n=>{k=1;while(k&&k!=n){for(x=i=0;i++<=k;)x+=1+~~(Math.random()*n);console.log(k+`d${n}: `+x);k+=x<k*n/2?-1:1}}

ডেমো

এটি কেবল ES6 সম্মতিযুক্ত ব্রাউজারগুলিতে কাজ করে (এই মুহূর্তে ফায়ারফক্স এবং এজ অন্তর্ভুক্ত রয়েছে, সম্ভবত পরীক্ষামূলক জাভাস্ক্রিপ্ট বৈশিষ্ট্য সহ Chrome এবং অপেরা রয়েছে):

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// Snippet stuff
console.log = x => {
  document.getElementById('O').innerHTML += x + `<br>`;
}

document.getElementById('F').addEventListener('submit', e => {
  document.getElementById('O').innerHTML = ``
  f(document.getElementById('I').valueAsNumber)
})
<form id=F action=# method=get>
  <label>
    Number of faces: 
    <input type=number min=3 max=25 value=9 required id=I>
  </label>
  <button>Play</button>
  
  <div>
    <output id=O></output>
  </div>
</form>


আপনি whileএকটি forলুপে পরিবর্তন করতে পারেন , |0তার পরিবর্তে গোল করে ~~()এবং কয়েকটি বিবৃতি সরিয়ে নিতে পারেন যাতে কয়েকটি বাইট সংরক্ষণের জন্য বন্ধনীগুলি সরিয়ে ফেলতে পারেন। এছাড়াও আপনি এটিকে একটি বেনামে ফাংশন করতে পারবেন (না f=) 103 বাইট:n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
ব্যবহারকারী 81655

@ ব্যবহারকারী 81655 ধন্যবাদ। কিছু কারণে আপনার সংস্করণ, যাতে আমি সরানো বিদেশী আউটপুট অনেকটা নির্মিত console.logঅপরের forলুপ (আমাকে তোমারটা 1 টির গৃহস্থালির কাজ বেশি খরচ)। এখনও এটি 106
rink.attendant.6

আমি এটি পরীক্ষা না করেই লিখেছিলাম, সুতরাং বেশিরভাগ ক্ষেত্রে এটি কাজ করে আমি আনন্দিত। :)
user81655

আপনি k&&k!=nশর্তটি তুলনা করে প্রতিস্থাপন করে একটি চরিত্র অর্জন করতে পারেনk%n!=0
Jupotter

@ জুটার ধন্যবাদ, k%nআরও ভাল কাজ করে;)
rink.attendant.6

1

সিজেম, 45 বাইট

ri:M;{X__{Mmr+}*[X'dM':S5$N]o_+XM*<_+(-:XM%}g

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

বর্ণটিকে বেশ আক্ষরিকভাবে কার্যকর করে (গাণিতিকভাবে ভুল "গড় রোল" সূত্র সহ)। বিল্ট-ইন কমান্ড নাম (খাটো কারণে হিসাবে প্রত্যাশিত, CJam করার জন্য নিচের মূল GolfScript প্রোগ্রাম porting বাইট একটি গুচ্ছ সংরক্ষণ mr, oএবং gপরিবর্তে rand, putsএবং do)।

গল্ফস্ক্রিপ্ট, 51 বাইট

~:&;{1..{&rand+}*[1"d"&": "4$]puts.+1&*<.+(-:1&%}do

এখানে আমার আসল গল্ফস্ক্রিপ্ট এন্ট্রি। উল্লেখযোগ্য গল্ফিং ট্রিকসটি ঘূর্ণিত হওয়ার জন্য ডাইসের বর্তমান সংখ্যা সংরক্ষণ করার জন্য একটি সুবিধামত প্রাক-প্রাথমিক ভেরিয়েবল হিসাবে নম্বরটি1 অন্তর্ভুক্ত করে । (পরিবর্তে সিজেএম সংস্করণ ব্যবহার করে X, যা সিজেএম মান 1 দিয়ে সূচনা করে))


পুনশ্চ. শিরোনামটি দেখে আমি প্রথমে যেকোনদাইসে এর উত্তর দিতে চেয়েছিলাম । তবে এই চ্যালেঞ্জের জন্য এটি একটি ভয়াবহ পছন্দ হিসাবে প্রমাণিত হয়েছে এবং আমি মনে করি না যে এটি দেওয়া হিসাবে এই অনুমানটি বাস্তবায়নের জন্য এটি ব্যবহার করা প্রযুক্তিগতভাবেও সম্ভব।

সমস্যা হল AnyDice লেখার জন্য একটি ডোমেইন-নির্দিষ্ট ভাষা হল নির্ণায়ক ঘূর্ণায়মান পরিসংখ্যান ক্যালকুলেট পাশা করার প্রোগ্রাম। যদিও একটি রোল সম্ভাব্য ফলাফল পরিদর্শন এবং তাদের উপর ভিত্তি করে শর্তসাপেক্ষ রোলস করছেন হয় পুনরাবৃত্তির মাধ্যমে সম্ভব, কোন উপায় কোনো প্রকৃত যদৃচ্ছতা তৈরি করতে পারেন। সুতরাং আপনি যখন যেকোনও ডাইসে ডাইস রোলগুলির এই অনুক্রমটি অনুকরণ করতে পারেন, তবে আউটপুট হিসাবে আপনি যা পেতে পারেন তা যেমন বলা যায়, প্রক্রিয়া শেষ হওয়া অবধি রোলসের সংখ্যা বা কোনও নির্দিষ্ট ধাপে ফলাফল বিতরণ।

যা কিছু বলেছিল, এখানে আমি যেকোনদাইসের নিকটে সবচেয়ে কাছাকাছি যেতে পারি :

N: 6
K: 1
function: clip X:n { result: X * (X < N) }
function: adjust X:n { result: [clip X + ((XdN)*2 >= X*N)*2-1] * (X > 0) }
loop I over {1..20} {
  output K named "dice in roll [I]"
  output KdN named "outcome of roll [I]"
  K: [adjust K]
}

এটি কোনও গল্ফ কোড নয়, যেহেতু এটিকে নিরর্থকতার অনুশীলনের মতো মনে হয়েছিল। স্ট্যান্ডার্ড ব্রেস ল্যাঙ্গুয়েজ গল্ফিং ট্রিকস, যেমন ফাংশন নামগুলি সংক্ষিপ্তকরণ এবং অপ্রয়োজনীয় সাদা স্থান নির্মূল করার মতো, গল্ফিং সম্ভাবনাগুলির বেশিরভাগই নিঃশেষ করা উচিত।

এখানে ব্যবহৃত মূল কৌশলটি হ'ল, যখন আপনি :nকোনও ডিভাইসে কোনও সংখ্যা (যেমন ফাংশন সংজ্ঞায় নির্দেশিত) প্রত্যাশা করে কোনও ফাংশন কল করেন এবং পরিবর্তে এটি একটি ডাই (যেমন একটি সম্ভাব্য বন্টন) পাস করেন, তখন যেকোন ডিজাইস স্বয়ংক্রিয়ভাবে সমস্ত সম্ভাবনার জন্য ফাংশনটি মূল্যায়ন করে ডাইয়ের মানগুলি এবং ফলাফলগুলিকে একটি নতুন ডাইয়ের সাথে সংযুক্ত করে।

প্রথম তিনটি রোলের জন্য আউটপুট (বার চার্ট ফর্ম্যাটে) এর একটি স্ক্রিনশট এখানে রয়েছে:

AnyDice স্ক্রিনশট

(নোট "0" প্রতিটি গ্রাফ কলাম সম্ভাব্যতা ইঙ্গিত করে যে যে পুনরাবৃত্তির বন্ধ, আঘাত পাশা সংখ্যার কারণে পারেন 0 বা এন, বর্তমান রোল আগে। এই বাঁধন শর্ত প্রতিনিধিত্ব করতে একটি সুবিধাজনক উপায় হতে হবে, যেহেতু অবশ্যই 0dN ঘূর্ণায়মান সর্বদা 0 উত্পাদন করে)


1

আর, 103 বাইট

মোটামুটি সোজা এগিয়ে বাস্তবায়ন পাশা রোলগুলি সম্পন্ন করে sum(sample(n,i))

i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}

টেস্ট রান

> i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}
1: 9
2: 
Read 1 item
1d9: 9
2d9: 14
3d9: 10
2d9: 14
3d9: 9
2d9: 9
3d9: 12
2d9: 7
1d9: 9
2d9: 11
3d9: 17
4d9: 18
5d9: 25
6d9: 29
7d9: 33
8d9: 43
9d9: 45
> 

1

কফিস্ক্রিপ্ট, 106 99 বাইট

f=(n,k=1)->(x=k;x+=Math.random()*n|0for[k..0];console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

# Previous attempt, 106 bytes
f=(n,k=1)->(x=i=0;x+=1+Math.random()*n//1while++i<=k;console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

Ungolfed

f = (n, k = 1) ->
 (x = k
 x += 1 + Math.random() * n | 0 for [k..0]
 console.log k + "d#{n}: " + x
 k += x < k * n / 2 && -1 || 1
 ) while k % n

1

জুলিয়া, 77 বাইট

n->(N=1;while 0<N<n k=sum(rand(1:n,N));print(N,"d$n: $k
");N+=1-2(2k<N*n)end)

এর বেশিরভাগ স্ব-বর্ণনামূলক হওয়া উচিত - একটি বাইট সংরক্ষণ করার printপরিবর্তে স্ট্রিংয়ে একটি আসল নিউলাইন ব্যবহৃত হচ্ছে println। 1 এবং এর মধ্যে এলোমেলো পূর্ণসংখ্যার rand(1:n,N)উত্পাদন করে ।Nn


1

রুবি, 93 90 82 টি অক্ষর

->n{d=s=2
puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}

নমুনা রান:

2.1.5 :001 > -->n{d=s=2;puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}[6]
1d6: 5
2d6: 10
3d6: 6
2d6: 5
1d6: 5
2d6: 8
3d6: 15
4d6: 18
5d6: 22

0

কিউবিআইসি , 83 বাইট (প্রতিদ্বন্দ্বী)

:c=a{e=0[1,q|e=e+_rq,a|]?!q$+@d|!+a$+@:|+!e$~e<c/2|q=q-1\q=q+1]c=q*a~q=a|_X]~q=0|_X

ব্যাখ্যা:

q                    Tracks the number of dice (is implicitly 1 at the start)
:                    Takes input from a CMD line parameter
[1,q|e=e+_rq,a|]     Rolls the dice separately
?!q$+@d|!+a$+@:|+!e$ Prints the roll result (requires an unfortunate amount of casting...)
~e<c/2|q=q-1\q=q+1]  Checks whether to increase or decrease
~q=a|_X]~q=0|_X      Tests the amount of dice and quits on either boundary.

0

পিএইচপি, 104 বাইট

for($n=$argv[$k=1];$k&&$k<$n;print$k."d$n: $x\n",$k-=$x<$n*$k/2?:-1)for($x=$i=0;$i++<$k;)$x+=rand(1,$n);

সাথে চালাও php -r '<code>' <N>

ভাঙ্গন

for($n=$argv[$k=1];     // import input, init number of dice
    $k&&$k<$n;          // while 0<$k<$n
    print$k."d$n: $x\n",    // 2. print results
    $k-=$x<$n*$k/2?:-1      // 3. remove or add a die
)
    for($x=$i=0;$i++<$k;)   // 1. roll dice separately
        $x+=rand(1,$n);         // sum up results
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.