এক্সপ্লোডিং ডাইস অনুকরণ


31

আপনার কাজটি হ'ল এমন একটি প্রোগ্রাম তৈরি করা যা কোনও পূর্ণসংখ্যার মধ্যে নিয়ে যায় n > 1এবং একক- nপক্ষীয় ডাইয়ের রোলটিকে আউটপুট করে । যাইহোক, এই পাশা বিস্ফোরিত পাশা নিয়ম অনুসরণ করে ।

আপনি যখন ডাই রোল করবেন তখন আপনি কোন মানটি রোল করেছেন তা পরীক্ষা করুন। আপনি যদি সেই ধরণের মৃত্যুর জন্য সর্বাধিক পেয়ে থাকেন (একটি স্ট্যান্ডার্ড ডি 4 তে যা 4, বা একটি ডি 6 এর উপর 6 ইত্যাদি), আবার রোল করুন এবং মোটটিতে নতুন রোল যুক্ত করুন। প্রতিটি রোল মোটে যোগ করতে থাকে, যতক্ষণ না আপনি সর্বাধিক সংখ্যাটি রোল না করে। সেই চূড়ান্ত নম্বরটি এখনও যুক্ত করা হয়েছে।

আপনার প্রোগ্রামটি একটি একক পূর্ণসংখ্যায় নেওয়া উচিত nএবং বিস্ফোরিত- nপক্ষীয় ডাই রোল করা উচিত । এটি দেখতে কেমন হওয়া উচিত তা দেখানোর জন্য এখানে একটি উদাহরণ বিতরণ n=4নোট করুন যে আপনার কখনই কোনও গুণফল আউটপুট করা উচিত নয় n, কারণ সেগুলি সর্বদা বিস্ফোরিত হবে।

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


1
প্রোগ্রামটি কি নিখুঁত হতে হবে? এর বিতরণটি কি খুব কম পরিমাণে বন্ধ করা যায়?
মালটিসেন

প্রতি: রিকার; আরই: @ উপরে মাল্টেসেনের মন্তব্য; বা চূড়ান্ত পরিমাণে?
আর্টেমিস মনিকাকে

2
@ আর্টেমিসফাউল এলোমেলো করার জন্য আমাদের মানদণ্ডগুলি দেখুন। এছাড়াও, এখানে
Rɪᴋᴇʀ

উত্তর:


36

x86 মেশিন কোড (ইনটেল আইভি ব্রিজের জন্য এবং তারপরে), 17 বাইট

31 C9 0F C7 F0 31 D2 F7 F6 42 01 D1 39 F2 74 F2 C3

উপরের কোডের বাইটগুলি একটি ফাংশন সংজ্ঞায়িত করে যা একটি বিস্ফোরিত ডাইয়ের অনুকরণ করে। এটি একটি একক ইনপুট নেয়, ESIনিবন্ধনে পাস হয় , মরণের সর্বাধিক সংখ্যা নির্দেশ করে। এটি ECXরেজিস্টারে একক মান প্রদান করে , যা রোলগুলির ফলাফল।

অভ্যন্তরীণভাবে, এটি নির্দেশটি একটি এলোমেলো সংখ্যা তৈরি করতে ব্যবহার করেRDRAND । এটি একটি এলোমেলো নম্বর জেনারেটর (আরএনজি) ব্যবহার করে যা ইন্টেল আইভি ব্রিজ প্রসেসরের এবং পরে (কিছু এএমডি সিপিইউগুলিও এই নির্দেশকে সমর্থন করে) হার্ডওয়্যারে অন্তর্নির্মিত হয়।

ফাংশনের যুক্তি অন্যথায় বেশ সোজা। উত্পাদিত এলোমেলো নম্বরটি স্ট্যান্ডার্ড টেকনিক ( (rand % dieSize) + 1) ব্যবহার করে পছন্দসই পরিসরের মধ্যে থাকাতে স্কেল করা হয় এবং তারপরে এটি কোনও বিস্ফোরণ ঘটায় কিনা তা পরীক্ষা করে দেখা হয়। চূড়ান্ত ফলাফল একটি সঞ্চালক রেজিস্টারে রাখা হয়।

এখানে একটি বর্ণিত সংস্করণ রয়েছে যা অ্যাসেম্বলি ভাষার স্মৃতিবিজ্ঞানগুলি দেখায়:

           unsigned int RollExplodingDie(unsigned int dieSize)
31 C9        xor     ecx, ecx    ; zero-out ECX, which accumulates the final result
           Roll:
0F C7 F0     rdrand  eax         ; generate a random number in EAX
31 D2        xor     edx, edx    ; zero-out EDX (in preparation for unsigned division)
F7 F6        div     esi         ; divide EDX:EAX by ESI (the die size)
                                 ;   EAX receives the quotient; EDX receives the remainder
42           inc     edx         ; increment the remainder
01 D1        add     ecx, edx    ; add this roll result to the accumulator
39 F2        cmp     edx, esi    ; see if this roll result should cause an explosion
74 F2        jz      Roll        ; if so, re-roll; otherwise, fall through
C3           ret                 ; return, with result in ECX register

আমি কিছুটা প্রতারণা করছি । সমস্ত স্ট্যান্ডার্ড x86 কলিং কনভেনশন EAXরেজিস্টারে কোনও ফাংশনের ফলাফল প্রদান করে । তবে, সত্যিকারের মেশিন কোডে, কোনও কলিং কনভেনশন নেই। ইনপুট / আউটপুট জন্য আপনি যে কোনও নিবন্ধগুলি চান তা ব্যবহার করতে পারেন। ECXআউটপুট রেজিস্টার ব্যবহার করে আমাকে 1 বাইট বাঁচিয়েছে। আপনি যদি ব্যবহার করতে চান তবে নির্দেশের ঠিক আগেই EAX1-বাইট XCHG eax, ecxনির্দেশ .োকান ret। এই অদলবদল মান EAXএবং ECXরেজিস্টার, কার্যকরীভাবে থেকে ফলাফলের অনুলিপি ECXমধ্যে EAX, এবং দেখছিলেন ECXপুরোনো মান EAX

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

এখানে সমতুল্য ফাংশন সি প্রতিলিপি, ব্যবহার করছে স্বকীয় জিসিসি, ঝনঝন শব্দ, এবং আইসিসি দ্বারা সমর্থিত জেনারেট করতে নির্দেশ:__builtin_ia32_rdrand32_stepRDRAND

#include <immintrin.h>

unsigned int RollExplodingDie(unsigned int dieSize)
{
    unsigned int result = 0;
Roll:
    unsigned int roll;
    __builtin_ia32_rdrand32_step(&roll);
    roll    = ((roll % dieSize) + 1);
    result += roll;
    if (roll == dieSize)   goto Roll;
    return result;
}

মজার বিষয় হচ্ছে, পতাকা সহ জিসিসি -Osএটিকে প্রায় একই মেশিন কোডে রূপান্তরিত করে । এটি এর EDIপরিবর্তে ইনপুট নেয় ESI, যা সম্পূর্ণ স্বেচ্ছাচারিত এবং কোড সম্পর্কে পদার্থের কোনও কিছুই পরিবর্তন করে না। এটি অবশ্যই ফলাফলটি ফিরে আসতে হবে EAX, যেমনটি আমি আগে উল্লেখ করেছি এবং এটি MOVতাত্ক্ষণিকভাবে এর আগে এটি করার জন্য আরও দক্ষ (তবে বৃহত্তর) নির্দেশিকা ব্যবহার করে RET। অন্যথায়, একই। প্রক্রিয়াটি পুরোপুরি বিপরীতমুখী হলে সর্বদা মজাদার: কোডটি সমাবেশে লিখুন, এটি সিতে প্রতিলিপি করুন, এটি একটি সি সংকলকটির মাধ্যমে চালনা করুন এবং আপনার আসল সমাবেশটি ফিরিয়ে আনুন!


12

পাইথন 2 , 66 64 61 বাইট

-3 বাইট xnor ধন্যবাদ

f=lambda n,c=0:c%n or c+f(n,randint(1,n))
from random import*

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

পূর্ববর্তী রোলটি সংরক্ষণ করা হয় c, আমাদের এটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় না করেই একাধিকবার অ্যাক্সেসের অনুমতি দেয় যা পাইথন ল্যাম্বডায় করা যায় না। প্রতিটি পুনরাবৃত্তি, আমরা আমরা বিস্ফোরণ পাশা ঘূর্ণিত কিনা তা পরীক্ষা করে নিই।

cশূন্য থেকে আরম্ভ করা হয়, তাই c%nসেখানে মিথ্যা। পরবর্তী পুনরাবৃত্তিতে, এটি কেবল মিথ্যা হবে যদি বিস্ফোরিত পাশা ঘূর্ণিত হয়।

পাইথন 2 , 55 বাইট

f=lambda n:randint(1,n)%n or n+f(n)
from random import*

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

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


2
পুনরাবৃত্ত ফাংশন যেখানে ব্রেকিং শর্তটি এলোমেলোতার উপর ভিত্তি করে থাকে সেখানে সর্বদা স্ট্যাক ওভারফ্লো হওয়ার একটি অ-শূন্য সুযোগ থাকবে। পরিসংখ্যানগত দিক থেকে তুচ্ছ সুযোগ, কিন্তু এখনও ...
মাইপটেলিয়ন

3
সাধারণত, স্ট্যাকের আকারটি আমার অভিজ্ঞতায় কোড গল্ফিং চ্যালেঞ্জগুলিতে অসীম বলে মনে করা হয়। স্ট্যাকের আকার অনন্তে বাড়ার সাথে সাথে স্ট্যাকের ওভারফ্লো হওয়ার সম্ভাবনাটি দ্রুত শূন্যে রূপান্তরিত হয়।
আরবো

আরবো আপনার মন্তব্যটি টাইপ করার আগে @ মাইপেটলিয়ন করুন যাতে আপনি ব্যবহারকারীকে পিং করতে পারেন
মিলকিওয়ে 90

1
আমার মনে হয় c*(c<n)হতে পারে c%n
xnor

@xnor অবশ্যই, আমি একজন বোকা ...
আরবো

12

আর , 39 বাইট

n=scan();n*rgeom(1,1-1/n)+sample(n-1,1)

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

ব্যাখ্যা: এই দ্রবণটি পুনরাবৃত্তি এড়ানো / যখন লুপগুলি ঘটবে সেগুলির সংখ্যার সরাসরি বিতরণ গণনা করে এড়ায় avo মারা যাওয়ার পক্ষের সংখ্যা হ'ল এন । যদি আপনি সাফল্যটিকে এন রোলিং এবং অন্য কোনও কিছু রোলিং হিসাবে ব্যর্থতা হিসাবে চিহ্নিত করেন তবে আপনার সম্ভাবনা 1এনসাফল্যের n । মোট বিস্ফোরণের সংখ্যা হ'ল প্রথম ব্যর্থতার আগে সাফল্যের সংখ্যা। এটি একটিজিমিটিRআমি(1-1এন)বিতরণ (উইকিপিডিয়া পৃষ্ঠা দেখুন, যা সাফল্য এবং ব্যর্থতার অন্যভাবে সংজ্ঞা দেয়)। প্রতিটি বিস্ফোরণমোট আনতেএন। চূড়ান্ত রোলটি একটিইউএনআমিRমি(1,2,...,এন-1)বিতরণ অনুসরণ করে যা আমরা মোট যোগ করি।


খুব সুন্দর! এলোমেলো চ্যালেঞ্জের জন্য বিল্টিন বিতরণগুলিকে ভাল লাগবে !
জিউসেপ

না sampleযদৃচ্ছতা জন্য মান পূরণ দেওয়া তার পক্ষপাত ?
শিয়ান

@ শি'আন প্রটিটি নিশ্চিতভাবে এটি করেন : এটি বিচ্ছিন্ন র্যান্ডম ভেরিয়েবলের জন্য বিল্ট-ইন র্যান্ডম জেনারেটর।
রবিন রাইডার

আমি জানি, আমি জানি, তবে আমি যে লিঙ্কটি রেখেছি তা চেক করুন: বিভেদ সহজাত sample ফলে সহজাততার অভাব ঘটে যা সর্বোচ্চ থেকে সর্বনিম্ন সম্ভাব্যতার অনুপাতকে ১.০৩ এর উচ্চতর হিসাবে দেয় ... শকিং, তাই না ?!
শি'আন

হ্যাঁ, এটি মর্মস্পর্শী। তবে আবার, আপনি কত ঘন ঘন এম 2 31 ব্যবহার sampleকরেনমি231 ? ;-)
রবিন রাইডার

9

পার্ল 6 , 26 বাইট

{sum {roll 1..$_:}...*-$_}

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

ব্যাখ্যা

{                        } # Anonymous block
                  ...      # Sequence constructor
     {roll 1..$_:}         #   Next elem is random int between 1 and n
                           #   (Called as 0-ary function with the original
                           #   $_ for the 1st elem, then as 1-ary function
                           #   with $_ set to the previous elem which
                           #   equals n.)
                     *-$_  #   Until elem not equal to n (non-zero difference)
 sum                       # Sum all elements

2
ভাল, আমার নিজের সমাধানটি ছিল{sum roll(*,1..$_)...$_>*}
জো কিং

9

জে , 16 11 বাইট

(+$:)^:=1+?

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

ব্যাখ্যা

টিএল; ডিআর 1+? ডাই রোলটি সম্পাদন করে, (+$:)^:=কেবল তখনই পুনরাবৃত্তি করে যখন এটি ইনপুটটির সমান হয়।


ফাংশনটি 4 ক্রিয়াগুলির একটি ট্রেন:

             ┌─ + 
         ┌───┴─ $:
  ┌─ ^: ─┴─ =     
  │               
──┤      ┌─ 1     
  └──────┼─ +     
         └─ ?     

একটি ট্রেন তখন হয় যখন 2 বা ততোধিক ক্রিয়া সংমিশ্রিত হয়। এখানে, উত্তরটি ফর্মটির f g h j:

(+$:)^:=  1  +  ?
    f     g  h  j

একটি তথাকথিত "4-ট্রেন" হুক এবং কাঁটাচামচ হিসাবে পার্স করা হয়েছে:

f g h j   ⇔   f (g h j)

সুতরাং, উত্তরটি সমান:

(+$:)^:= (1 + ?)

হুকস: (f g) xএবংx (f g) y

একটি monadic (এক যুক্তি) দুটি ক্রিয়া এর হুক, একটি আর্গুমেন্ট দেওয়া x, নিম্নলিখিত সমতুল্য ধারণ করে:

(f g) x   ⇔   x f (g x)

উদাহরণস্বরূপ, (* -) 5মূল্যায়ন করে 5 * (- 5)যা মূল্যায়ন করে _25

এর অর্থ হ'ল আমাদের 4-ট্রেন, এর একটি হুক fএবং এর (g h j)সমতুল্য:

(f (g h j)) x   ⇔   x f ((g h j) x)

কিন্তু fএখানে কি করে ? পাওয়ার সংমিশ্রণটি (+$:)^:=ব্যবহার করে দুটি ক্রিয়া সংমিশ্রণ : অন্য হুক ( ) এবং একটি ক্রিয়া ( )। নোট এখানে হয় dyadic -এটা দুটি আর্গুমেন্ট আছে ( এবং )। সুতরাং আমাদের কীভাবে আচরণ করে তা দেখতে হবে । পাওয়ার সংমিশ্রণটি একটি ক্রিয়া এবং একটি ক্রিয়া বা একটি বিশেষণ নেয় (একটি বিশেষ্য কেবলমাত্র ডেটার টুকরো) এবং সময় প্রয়োগ করে । উদাহরণস্বরূপ, নিন । নিম্নলিখিত সমতুল্য হোল্ড:^:(+$:)=fx(g h j) x^:f^:ofof oo = 3

(f^:3) x     ⇔   f (f (f x))
x (f^:3) y   ⇔   x f (x f (x f y))

যদি oএকটি ক্রিয়া হয় তবে শক্তি সংযোগটি কেবল মূল্যায়ন করবেo আর্গুমেন্টগুলির উপর থেকে এবং বিশেষ্য ফলাফলটি পুনরাবৃত্ত গণনা হিসাবে ব্যবহার করবে।

আমাদের ক্রিয়া জন্য, oহয় =, সমতা ক্রিয়া। এটি 0ভিন্ন ভিন্ন যুক্তিগুলির জন্য 1এবং সমান আর্গুমেন্টের জন্য মূল্যায়ন করে । আমরা (+$:)সমান তর্ক করার জন্য একবার হুকটি পুনরাবৃত্তি করি এবং ভিন্ন ভিন্ন ব্যক্তির জন্য কোনও সময় নেই। ব্যাখ্যাটির জন্য স্বরলিপিটির জন্য, আসুন y ⇔ ((g h j) x)। মনে রাখবেন যে আমাদের প্রাথমিক হুক এটির সমতুল্য:

x   (+$:)^:=   ((g h j) x)
x   (+$:)^:=   y

সংমিশ্রণটি প্রসারিত করে, এটি হয়ে যায়:

x ((+$:)^:(x = y)) y

যদি xএবং yএকই হয় তবে এটি হয়ে যায়:

x (+$:)^:1 y   ⇔   x (+$:) y

অন্যথায়, এটি হয়ে যায়:

x (+$:)^:0 y   ⇔   y

এখন, আমরা একাকী কাঁটাচামচ দেখেছি। এখানে, আমাদের একটি ডায়ডিক কাঁটাচামচ রয়েছে:

x (f g) y   ⇔   x f (g y)

সুতরাং, কখন xএবং yএকই হয়, আমরা পাই:

x (+$:) y   ⇔   x + ($: y)

কী $:? এটি সম্পূর্ণ ক্রিয়া নিজেই বোঝায় এবং পুনরাবৃত্তি করার অনুমতি দেয়। এর অর্থ হ'ল, কখন xএবং y are the same, we apply the verb toy and addx` এর সাথে।

কাটাচামচ: (g h j) x

এখন, ভিতরের কাঁটাচামচ কী করে? এটি ছিল yআমাদের শেষ উদাহরণে। একটি যুক্তি প্রদত্ত, তিনটি ক্রিয়াপদের একাকী কাঁটাচামচ জন্য x, নিম্নলিখিত সমতুল্যতা ধরে রাখুন:

(g h j) x   ⇔   (g x) h (j x)

এই পরবর্তী উদাহরণ স্বরূপ, ধরুন আমরা ক্রিয়া নামে আছে SUM, DIVIDEএবং LENGTH, যা তুমি কি অনুমান করা তারা পারে। যদি আমরা তিনটিকে একটি কাঁটাচামচ দিয়ে সংযুক্ত করি তবে আমরা পাই:

(SUM DIVIDE LENGTH) x   ⇔   (SUM x) DIVIDE (LENGTH x)

এই কাঁটাচামচ গড়ের মূল্যায়ন করে x(ধরে নেওয়া xহচ্ছে সংখ্যার একটি তালিকা)। জেতে, আমরা আসলে এটি উদাহরণ হিসাবে লিখতে চাই+/ % #

কাঁটাচামচ সম্পর্কে একটি শেষ জিনিস। যখন বামতম "টাইন" (উপরে আমাদের প্রতীকী ক্ষেত্রে,g ) একটি বিশেষ্য হয়, তখন সেই মানটি ফিরিয়ে দেওয়া একটি ধ্রুবক ফাংশন হিসাবে বিবেচিত হয়।

এই সমস্ত জায়গায়, আমরা এখন উপরের কাঁটাটি বুঝতে পারি:

(1 + ?) x   ⇔   (1 x) + (? x)
            ⇔   1 + (? x)

?[0,এক্স)[1,এক্স]

সবগুলোকে একত্রে রাখ

এই সমস্ত জিনিস দেওয়া, আমাদের ক্রিয়া সমান:

((+$:)^:=1+?) x   ⇔   ((+$:)^:= 1 + ?) x
                  ⇔   ((+$:)^:= (1 + ?)) x
                  ⇔   x ((+$:)^:=) (1 + ?) x
                  ⇔   x ((+$:)^:=) (1 + (? x))
                  ⇔   x (+$:)^:(x = (1 + (? x))
(let y = 1 + (? x))
if x = y          ⇒   x + $: y
otherwise         ⇒   y

এটি পছন্দসই কার্যকারিতা প্রকাশ করে।


1
(+$:)^:=1+?­­
এনজিএন

@ ধন্যবাদ! অন্তর্ভূক্ত.
কনর ও'ব্রায়ান

7

জেলি , 7 বাইট

X+ß}¥=¡

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

পুনরাবৃত্তি ব্যবহার করে। প্রোগ্রামটি আবার ( ß) চালায় এবং ( ) যোগ করে +যদি ( ¡) র্যান্ডম সংখ্যা ( X) =প্রোগ্রামের ইনপুটটিতে সমান ( ) হয়। }তোলে ßপ্রোগ্রাম ইনপুট এবং কাজ ¥সম্মিলন +ß}জন্য একটি একক লিংক মধ্যে ¡গ্রাস।

এখানে এন = 6 এর জন্য 1000 আউটপুটগুলির বিতরণ যা আমি এই প্রোগ্রামটি ব্যবহার করে সংগ্রহ করেছি । পাইথন / ম্যাটপ্ল্লিটিব দিয়ে প্লট করা হয়েছে। বারলেখ

এখানে সেমিলোগ প্লটে এন = 3 থেকে 5000 ডেটা পয়েন্ট রয়েছে যা (প্রায়?) সূচকীয় বিতরণ দেখায়। এখানে চিত্র বর্ণনা লিখুন


চমৎকার প্লট! আপনি যে বিতরণ পাবেন তা জ্যামিতিক বিতরণ ( আমার আর উত্তর দেখুন ), যা ঘনিষ্ঠভাবে বিতরণের সাথে সম্পর্কিত
রবিন রাইডার

6

পাইথ - 12 11 বাইট

কার্যকরী সময় ব্যবহার করে। আমি মনে করি যে একটি বুদ্ধিমান উত্তর থাকা উচিত যা কেবলমাত্র বিতরণকে অনুকরণ করে।

-.W!%HQ+hOQ

-         (Q)         Subtract Q. This is because we start Z at Q to save a char
 .W                   While, functionally
  !                   Logical not. In this case, it checks for 0
   %HQ                Current val mod input
  +     (Z)           Add to current val
   h                  Plus 1
    OQ                Random val in [0, input)

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


4

পাইথন 3 , 80 বাইট

import random as r,math
lambda n:int(-math.log(r.random(),n))*n+r.randint(1,n-1)

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


1
r.random()০. ফিরে আসার ক্ষেত্রে ব্যর্থতার সামান্য সুযোগ আছে 1-r.random()যদিও কাজ করা উচিত।
nwellnhof

যদিও প্রযুক্তিগতভাবে সেই সুযোগটি 0
কুইন্টেক

1
একটি বিরল ঘটনা যেখানে import ... as _সবচেয়ে কম!
xnor

@ এক্সনর সত্যই! কেবলমাত্র অন্য সময় মনে আছে যে আমার উত্তরে বিজয়ী হওয়া এখানে
লিন

4

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

[ILΩDIÊ#}O

এটি অনলাইনে চেষ্টা করুন বা তালিকাগুলি যাচাই করুন

10 বাইট বিকল্প:

[LΩDˆÊ#}¯O

এটি অনলাইনে চেষ্টা করুন বা তালিকাগুলি যাচাই করুন

যদিও আমি শীর্ষস্থানীয়টিকে আরও পছন্দ করি কারণ এটি এতে 'শব্দ' পেয়েছিল DIÊযা চ্যালেঞ্জের পক্ষে উপযুক্ত।

ব্যাখ্যা:

[         # Start an infinite loop:
 IL       #  Create a list in the range [1, input]
   Ω      #  Pop and push a random value from this list
    D     #  Duplicate it
     IÊ   #  If it's NOT equal to the input:
       #  #   Stop the infinite loop
}O        # After the loop: sum all values on the stack
          # (which is output implicitly as result)

[         # Start an infinite loop
 L        #  Create a list in the range [1, (implicit) input]
  Ω       #  Pop and push a random value from this list
   Dˆ     #  Add a copy to the global_array
     Ê    #  If it's NOT equal to the (implicit) input:
      #   #   Stop the infinite loop
        # After the loop: push the global_array
  O       # Pop and push its sum
          # (which is output implicitly as result)  

ব্যবহার করার উপায় বা কিছু মনে করার চেষ্টা করছিল ।
ম্যাজিক অক্টোপাস উরন


3

আর , 47 42 বাইট

function(n){while(!F%%n)F=F+sample(n,1)
F}

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

ক্রেডিট ArBo এর পদক্ষেপ

রবিন রাইডারের চেয়ে আরও একটি বাইট , তার উপরে উঠুন!


মজার বিষয় হচ্ছে, আমি এটি if46 বাইটের জন্য একটি পুনরাবৃত্তিতে পুনরায় কাজ করেছিলাম তবে শেষ হয়েছে একটি রোলের সাথে 52 পেয়ে যা এন = 4 দিয়ে সম্ভব নয়, তাই আমি জানি না যে কোনও অদ্ভুত নিম্ন পুনরাবৃত্তি সীমাবদ্ধতা ঘটছে কিনা তবে আমি মনে হয় এটি বগি হতে পারে। এটি অনলাইন চেষ্টা করুন!
অপরাধমূলকভাবে

আমি একটি পুনরাবৃত্তির চেষ্টা করেছি এবং একটি 54 বাইট সমাধান পেয়েছি। তারপরে 44 এর মতো আপনার মতো কিছু চেষ্টা করে দেখুন এটি অনলাইনে চেষ্টা করুন!
হারুন হায়মান



3

হাস্কেল , 77 76 বাইট

import System.Random
f x=randomRIO(1,x)>>=(x!)
x!y|y<x=pure y|0<1=(y+)<$>f x

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

একটি বাইট জন্য মারাত্মক ধন্যবাদ।

যদি উপস্থাপনায় <|>থাকি তবে আমরা আরও ভাল করতে পারতামMonadComprehensions :

হাস্কেল , অ-প্রতিযোগী, 66 বাইট by

import System.Random
f x=do y<-randomRIO(1,x);[y|y<x]<|>(y+)<$>f x

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


1
আপনি যদি ইনফিক্স ফাংশন হিসাবে জি সংজ্ঞা দেন তবে আপনি একটি বাইট সংরক্ষণ করতে পারেন।
মারাত্মক

1
@ কিলমাস, ধন্যবাদ প্রথম নজরে আমি বুঝতে পারি যে এটি একই বা আরও খারাপ হতে পারে তবে এটি আরও ভাল।
dfeuer

3

পাইথন 2 , 53 বাইট

f=lambda n:random()*n//1or n+f(n)
from random import*

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

আরবোর উত্তরor থেকে সংক্ষিপ্তসার্কিটিং ধারণা ব্যবহার করে । অভিব্যক্তি থেকে একটি নম্বরে উত্পন্ন করতে সঙ্গে, একটি রোল ভাগ বসাচ্ছে । যে সংখ্যা লাগে, ব্যতীত যদি এটা শূন্য (Falsey) এর এটি চলতে ।random()*n//10n-10norn+f(n)


আমি মনে করি আমার সংক্ষিপ্ত একটিতে সম্পাদনা করার সময় আপনার উত্তরটি ইতিমধ্যে ছিল ... আমি এটি দেখতে পাইনি তবে আপনি যদি এটি মুছতে চান তবে এটি ঠিক একই রকম হবে।
আরবো


3

জাপট , 13 বাইট

ö)g@¶°X?X+ß:X

চেষ্টা করে দেখুন

Arnauld এর উত্তর বন্দর । কীভাবে পুনরাবৃত্ত কল করতে হবে তা নির্ণয় করেছেন;)

ট্রান্সপ্লাইলড জেএস:

// U: Implicit input
// ö: generate a random number [0,U)
(U.ö())
  // g: run the result through a function
  .g(function(X, Y, Z) {
    // increment the result and compare to input
    return U === (++X)
      // if they are the same, roll again and add to current roll
      ? (X + rp())
      // if they are different, use current roll
      : X
   })

1
এর খুব দুর্দান্ত ব্যবহার N.g(f):)
শেগি

আমি নিজেই এটিকে ছুরিকাঘাত করেছি এবং 12 বাইট দিয়ে শেষ করেছি তবে আমি এটি পোস্ট করতে চাই না কারণ আমি আপনার সমাধানটি খুব পছন্দ করি!
শেগি

এটি একটি ভিন্ন উত্তর হিসাবে পোস্ট করুন :)
ডানা

এটি সংক্ষিপ্ত হতে পারে তবে এটি আপনার চেয়ে অনেক খারাপের
শ্যাগি

আমি দেখছি - হ্যাঁ আমি দূষণ না করার উপায় নিয়ে আসার চেষ্টা করছিলাম U। একটি লাইন এড়িয়ে যাওয়াও কাজ করবে বলে মনে হচ্ছে। এটি একটি দুর্দান্ত কৌশল :)
ডানা

3

Japt , 12 বাইট

এটি ডানার সমাধানের চেয়ে কম হতে পারে তবে এটি অনেক খারাপ। আমি কেবল এটি পোস্ট করছি কারণ এটি আমাদের কাছে চিরকালের মতো মনে হচ্ছে যেহেতু আমাদের একটি জাপট সমাধান রয়েছে যা একটি খালি লাইন দিয়ে শুরু হয়েছিল।


ö
>°V©VªV+ß

চেষ্টা করে দেখুন


2

পাওয়ারশেল , 49 বাইট

for($a=$l="$args";$a-eq$l){$o+=$l=1..$a|Random}$o

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

Iterative পদ্ধতি। সেট ইনপুট $argsকরতে $aএবং $lAST রোল (করা তাই আমরা একবার অন্তত লুপ লিখুন)। তারপরে, যতক্ষণ না শেষ রোলটি -eqইনপুটটিতে ইউল থাকে, আমরা ঘূর্ণায়মান থাকি। লুপের অভ্যন্তরে আমরা $oশেষ রোলটিতে জমে থাকি , যা 1ইনপুট থেকে ইনপুট পর্যন্ত একটি পরিসীমা তৈরি করে $aএবং এর Randomউপাদানটি বাছাই করে আপডেট হয় । (সত্যি বলতে আমি একটু অবাক যে আছি $o+=$l=কাজ করে।) একবার আমরা লুপ ফুরিয়েছে, আমরা ছেড়ে $oপাইপলাইন প্রকল্পের এবং আউটপুট অন্তর্নিহিত হয়।


2

ফোর্থ (গফার্থ) , 72 বাইট

include random.fs
: f >r 0 begin i random 1+ >r i + r> i < until rdrop ;

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

কোড ব্যাখ্যা

include random.fs      \ include library file for random
: f                    \ start a new word definition
  >r                   \ stick the input on the return stack (for easy access)
  0                    \ add a counter to hold the sum
  begin                \ start an indefinite loop
    i random 1+        \ generate a random number from 1 to n
    >r i + r>          \ add the result to the counter, use the return stack to save a few bytes
    i <                \ check if result was less than n
  until                \ end the loop if it was, otherwise go back to begin
  rdrop                \ remove n from the return stack
;                      \ end the word definition

2

ব্যাচ, 70 বাইট

@set t=0
:g
@set/at+=d=%random%%%%1+1
@if %d%==%1 goto g
@echo %t%

nকমান্ড-লাইন প্যারামিটার হিসাবে ইনপুট নেয় %1dবর্তমান রোল, tমোট মোট। dসমান না হওয়া পর্যন্ত কেবল ঘূর্ণায়মান রাখে n


2

জেলি , 9 বাইট

x⁹X€Ä%ƇµḢ

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

একটি মোনাডিক লিঙ্ক যা এনটিকে তার যুক্তি হিসাবে গ্রহণ করে এবং একটি বিস্ফোরিত এন-পার্শ্বযুক্ত ডাই দ্বারা উত্পাদিত একটি সংখ্যা প্রদান করে। এটি 1 থেকে এন থেকে 256 নম্বর উত্পন্ন করে এবং প্রথম সংখ্যার যোগফল দেয় যা এন এর একাধিক নয়। তত্ত্বগতভাবে এটি 256n ফিরে আসতে পারে, তবে এমনকি দ্বি-পার্শ্বের মৃত্যুর জন্যও এই ঘটবে কেবল একটিই2256 বার।

এই সীমাবদ্ধতা নেই এমন একটি বিকল্প হ'ল:

জেলি , 10 বাইট

X³X¤+¥³ḍ¥¿

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

উভয় টিআইও লিঙ্কগুলি বিতরণ দেখানোর জন্য 400 নম্বর উত্পন্ন করে নোট করুন।


2

পাইথন 3 , 81 72 বাইট

from random import*
def f(x,a=0):
 while a%x<1:a+=randint(1,x)
 return a

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

-9 বাইটস আরবোকে ধন্যবাদ

ব্যাখ্যা

import random             #load the random module              
def explodeDice(num):     #main function
    ans = 0                     #set answer to 0
    while a % num != 0:         #while a isn't a multiple of the input
        ans += random.randint(1, num) #add the next dice roll to answer
    return ans                  #return the answer

from random import*পরিবর্তে ব্যবহার করে আপনি 1 বাইট সংরক্ষণ করতে পারেন ।
অরথপ্লেক্স

1
আপনি এই পুনরাবৃত্তামূলক সমাধানটি ব্যবহার করে এটি 74 বাইটে নামিয়ে আনতে পারেন
মনিকা

1
@squid আপনি 1 বাইট মত রক্ষা করতে পারে এই
অরথপ্লেক্স

1
@orthoplex এবং তারপর আপনি যদি / অন্যথায় কমান করতে পারেন, এবং এটি একটি এক-লাইনের করা । তখন আমার সমাধানটির মতো দেখতে শুরু;)
আরবো

1
@ আরবো হ্যাঁ তাই আমি পুনরুক্তিতে পরিবর্তন করি নি, কেবল আপনাকে অনুলিপি করতে চাই নি।
আর্টেমিস মনিকা 18

2

টিআই-বেসিক, 28 23 বাইট

-5 বাইটস এই মেটা পোস্টের জন্য ধন্যবাদ !

Ans→N:0:Repeat fPart(Ans/N:Ans+randInt(1,N:End:Ans

ইনপুট রয়েছে Ans
আউটপুটটি রয়েছে Ansএবং স্পষ্টভাবে মুদ্রিত হয়েছে।

উদাহরণ:

4
              4
prgmCDGF11
              5
6
              6
prgmCDGF11
              3

ব্যাখ্যা:

Ans→N:0:Repeat fPart(Ans/N:Ans+randInt(1,N:End:Ans   ;full logic

Ans→N                                                ;store the input in "N"
      0                                              ;leave 0 in "Ans"
        Repeat fPart(Ans/N                 End       ;loop until the sum
                                                     ; is not a multiple of
                                                     ; the input
                               randInt(1,N           ;generate a random
                                                     ; integer in [1,N]
                           Ans+                      ;then add it to "Ans"
                                               Ans   ;leave the sum in "Ans"
                                                     ;implicitly print "Ans"

নোট:

  • টিআই-বেসিক একটি টোকেনাইজড ভাষা। অক্ষর গণনা বাইট গণনা সমান হয় না

যেহেতু startTmrআর প্রয়োজন নেই, তাই এই জমাটি এখন টিআই-বেসিক সংস্করণগুলির জন্য টিআই -৪৪+ এর আগে কাজ করবে
তাউ

2

স্মাইলব্যাসিক 3, 49 বাইট

ফাংশন D N OUT Rপুনরাবৃত্তভাবে বিস্ফোরিত ডাইস রোলগুলি প্রয়োগ করে।

DEF D N OUT R
R=RND(N)+1IF R==N THEN R=R+D(N)
END

Ungolfed

DEF D N OUT R  'N is sides and R is output param (shorter than using RETURN in this case)
 R=RND(N)+1  'random number in [1, N]
 IF R==N THEN R=R+D(N)  'if roll is same as N then roll again and add
END

মনে রাখবেন যে SmileBASIC এ, ফাংশনগুলির একাধিক রিটার্ন মান থাকতে পারে। যদি কোনও ফাংশনের একটি রিটার্ন মান থাকে fun in OUT varএবং var = fun(in)ঠিক একই রকম হয়, যার জন্য আমরা ফাংশনটি OUTফর্মটিতে সংজ্ঞায়িত করতে পারি এবং এটি ফাংশন বডিতে নিজেই একটি অভিব্যক্তিতে বলতে পারি। আমি যদি ফাংশনটি সংজ্ঞায়িত করে DEF D(N)থাকি তবে আমাকে ফাংশন বডিটিতে স্পষ্টভাবে বলতে হবে RETURN R; উভয় বাক্য গঠন মিশিয়ে আমার বাইট সংরক্ষণ করা।



2

জেলি , 7 বাইট

X=п⁸S_

একটি পূর্ণসংখ্যার লিঙ্ক একটি পূর্ণসংখ্যা গ্রহণ করে n, যা একটি পূর্ণসংখ্যা দেয়।

এটি অনলাইন চেষ্টা করুন! বা গণনা দেখুন105 রান

কিভাবে?

X=п⁸S_ - Link: integer, n
  п    - Collect up while...
 =  ⁸   - ...condition: equal to chain's left argument, n
X       - ...next value: random number in [1..n]
     S  - sum
      _ - subtract n (since the collection starts with [n])

2

স্মাইলব্যাসিক, 41 বাইট

INPUT N@L
S=S+RND(N)+1ON S MOD N GOTO@L?S

পড়ার পর:

নোট করুন যে আপনার কখনই n এর কোনও গুণফল আউটপুট করা উচিত নয়, কারণ সেগুলি সর্বদা বিস্ফোরিত হবে।

আমি বুঝতে পেরেছি যে ডাইস রোল কিনা তা যাচাই করার পরিবর্তে nযোগফলটি একাধিক হলে আপনি কেবল পুনরাবৃত্তি করতে পারেন n


2

AnyDice , 36 বাইট

ভাষায় প্রায় অন্তর্নির্মিত:

function:f I:n{result: [explode dI]}

এটি সঠিক হওয়ার জন্য আমাকে অসীম পুনরাবৃত্তির গভীরতা অনুমানের অপব্যবহার করতে হবে। AnyDice বিশ্বব্যাপী সম্পত্তি সর্বাধিক কার্যকারিতার গভীরতার সাথে পুনরাবৃত্তির গভীরতা সীমাবদ্ধ করে। বিস্ফোরিত অন্তর্নির্মিত যদিও এটি নিজস্ব নিজস্ব ব্যবহার করে; বিস্ফোরণ গভীরতা - যা ডিফল্ট 2।

set "explode depth" to 99

আরও 25 বাইট যুক্ত হবে; এবং ডায়াসের পক্ষে 99 বারের বেশি বিস্ফোরিত হওয়া তাত্ত্বিকভাবে সম্ভব হওয়ায় এটি প্রয়োজনীয়তার সাথে সত্যিই মিলবে না।

ফাংশনের আউটপুট হ'ল ডাই, অর্থাৎ। ফলাফলের জন্য সম্ভাব্যতা এবং সম্ভাবনার একটি পৃথক অন্তর্নিহিত টাইপ এমন কোনও ডিজাইস।


1
আমি মনে করি এটি খুব বেশি বিস্ফোরিত না হয়ে আমি ঠিক আছি, ৩ by বাইট আমার দ্বারা ভাল। আমি কোনও বিল্টিনই বলিনি এবং আমি এখানে রাখার সাথে আমি ঠিক আছি, কারণ এটি আপনার 1 বা 0 বাইট উত্তর জয়ের মতো নয়। তবে সাইটে স্বাগতম!
আর

2

সিজেম , 19 বাইট

qi{__mr)_T+:T;=}g;T

ব্যাখ্যা:

T is pre-set to 0

qi{__mr)_T+:T;=}g;T - whole code
qi                  - read input as integer (n) | Stack: n
  {            }    - block
   __               - Duplicate twice | Stack: n n n
     mr)            - Choose a random number from 1 to n (r). Since 'mr' picks a
                      number from 0 to n-1, the number has to be incremented with ')' 
                      Stack: n n r
        _           - Duplicate |  Stack: n n r r
         T          - push T | Stack: n n r r T
          +         - add the random number to T (t) | Stack: n n r t
           :T;      - pop the value and store in T | Stack: n n r
              =     - are the top two stack values the same (c) | Stack: n c
               }
                g   - do while loop that pops the condition from the stack after each
                      iteration | Stack: n
                 ;  - pop the top stack element and discard | Stack: T
                  T - push T | Stack: T
                    - implicit output

বা সিউডোকোডে:

input n
var sum = 0
do {
    var random_number = pick random number from 1 to n
    sum = sum + random_number
} while (random_number == n)
output n

ফ্লোচার্ট হিসাবে:

কোডের ফ্লোচার্ট

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


2

এক্সেল ভিবিএ, 46 বাইট

@ টেলরস্কট ধন্যবাদ

Do:v=-Int(-[A1]*Rnd):t=t+v:Loop While[A1]=v:?t

কমান্ড উইন্ডোতে কার্যকর করা হয়েছে।

একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন হিসাবে।

এক্সেল ভিবিএ, 108 67 বাইট

Function z(i)
Do
v=Int((i*Rnd)+1)
z=z+v
Loop While v=i
End Function

আপনি এটি do.. loop whileলুপ ব্যবহার করে এবং ফাংশনটিকে তাত্ক্ষণিক উইন্ডো ফাংশনে রূপান্তর করে একে একে কিছুটা নামিয়ে আনতে পারেন । - Do:v=-Int(-[A1]*Rnd):t=t+v:Loop While[A1]=v:?t- 46 বাইট
টেলর স্কট

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