একটি পাতলা, শিম মেশিন


26

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

|     O     |
|     ^     |
|    ^ ^    |
|   ^ ^ ^   |
|  ^ ^ ^ ^  |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|

এই চিত্রটিতে, Oমার্বেলগুলি যে স্থান থেকে পড়েছে তার অবস্থানটি নির্দেশ করে। প্রত্যেকটি ^একটি পিন যেখানে মার্বেলটির বামে বা পিনের ডানদিকে স্কোয়ারে যাওয়ার 50% সুযোগ রয়েছে। তারপরে মার্বেলগুলি ডিভাইসের নীচে বাঁধাগুলিতে জড়ো হয় এবং প্রচুর পরিমাণে মার্বেলের জন্য, ডাবের মধ্যে মার্বেলের স্ট্যাকের উচ্চতা একটি বিচ্ছিন্ন দ্বিপদী বন্টনের অনুরূপ।

চ্যালেঞ্জ

এই চ্যালেঞ্জের জন্য, আপনি উপরের মতো ডায়াগ্রামের উপর ভিত্তি করে শিম মেশিনগুলির ফলস্বরূপ সম্ভাব্যতা বিতরণ গণনা করবেন। চিত্রগুলি দ্বি-মাত্রিক 'প্রোগ্রাম' হিসাবে ব্যাখ্যা করা হয় যা মার্বেলগুলি পাশের ক্ষেত্রগুলিতে বা বর্তমান ক্ষেত্রের নীচে ক্ষেত্রগুলির মধ্য দিয়ে যায়। মার্বেলগুলি মেশিনের নীচে পৌঁছলে তারা সম্ভাবনা বন্টনের জন্য গণনা করা হয়। এটিকে আকর্ষণীয় রাখার জন্য, এই চিত্রগুলিতে কেবল সাধারণ উত্স এবং পিনগুলি ছাড়াও আরও কয়েকটি ক্ষেত্র থাকবে। উদাহরণ চিত্রটি হ'ল:

|     O     |
|     ^     |
|    ^ /    |
|   ^ | ^   |
|  <^- =  v |
| ^ ^ ^ ^ ^ |

তদতিরিক্ত, এখন মার্বেলগুলির প্রত্যেকের একটি ঘূর্ণন দিক রয়েছে। এই দিকটি কয়েকটি ক্ষেত্র দ্বারা সেট করা হয়েছে এবং এটি নির্ধারণ করে যে পরবর্তী ক্ষেত্রটি মার্বেলটি অন্য কয়েকটি ক্ষেত্রে চলে।

নিম্নলিখিত ক্ষেত্রগুলি সংজ্ঞায়িত করা হয়েছে:

  • O: সূত্র. স্প্যানস মার্বেলগুলি এর সরাসরি নীচে। এই মার্বেলের দিকটি 50% বাম, 50% ডান। প্রতিটি উত্স একই পরিমাণে মার্বেল উত্পাদন করে।
  • U: ডুবুন এই ক্ষেত্রের মধ্যে প্রবেশ করা কোনও মার্বেল বিন মেশিন থেকে সরানো হবে।
  • : শুন্যস্থান. যদি কোনও মার্বেল এই ক্ষেত্রটিতে আসে তবে এটি নীচের মাঠে চলে যাবে।
  • -: তল। যদি কোনও মার্বেল এই ক্ষেত্রটিতে আসে তবে এটি বর্তমান দিকের উপর নির্ভর করে বাম দিকে ক্ষেত্র বা ডানদিকে ক্ষেত্রের দিকে চলে যাবে।
  • ^: বিভক্ত। যদি কোনও মার্বেল এই ক্ষেত্রটিতে আসে তবে এর একটি 50% ডানদিকে বা স্প্লিটারের বাম দিকে ক্ষেত্রের দিকে সরবে। এটি মার্বেলের দিকও নির্ধারণ করে।
  • v: যোগ দিন। যদি কোনও মার্বেল এই ক্ষেত্রটিতে আসে তবে এটি নীচের মাঠে চলে যাবে।
  • /: স্ল্যাটেড প্যাড যদি কোনও মার্বেল এই ক্ষেত্রটিতে আসে তবে এটি মার্বেলের দিক নির্ধারণ করে প্যাডের বাম দিকে মাঠে চলে যাবে।
  • \: আগের মত একই, তবে ডানদিকে।
  • |: প্রতিফলক। যদি কোনও মার্বেল এই ক্ষেত্রটিতে আসে তবে এটি মার্বেলের দিকটিকে বিপরীত করবে এবং মার্বেলটিকে এই বিপরীত দিকের ভিত্তিতে ডান বা বাম দিকে ক্ষেত্রের দিকে নিয়ে যাবে।
  • =: কামান। একটি মার্বেল এই ক্ষেত্রে আসে, তাহলে এটি, ডান অথবা বর্তমান দিক থেকে বামে এটিকে সরান পর্যন্ত মার্বেল একটি ক্ষেত্র নয় encounters হবে , -বা O
  • <: পূর্বের মতো একই, তবে সর্বদা দিকনির্ধারণ এবং বাম দিকে অগ্রসর হবে।
  • >: আগের মত একই, তবে ডানদিকে।

ডায়াগ্রাম সম্পর্কিত নিম্নলিখিত গ্যারান্টি দেওয়া হয়।

  • প্রতিটি ইনপুট সারিতে ক্ষেত্রগুলিতে ঠিক একই দৈর্ঘ্য থাকবে।
  • প্রতিটি সারির বামে এবং ডানদিকের ক্ষেত্রটি সর্বদা ক |
  • চিত্রটিতে কোনও সম্ভাব্য পথ থাকবে না যার মাধ্যমে মার্বেলগুলি অনন্তর পরিমাণে পুনরাবৃত্তির জন্য মেশিনে আটকে যেতে পারে, যেমন \/বা ^^
  • চিত্রটিতে কেবলমাত্র উল্লিখিত ক্ষেত্রগুলি থাকবে।
  • এক বা একাধিক উত্স আছে

ফল

আপনার কাজটি সম্ভাব্যতা বিতরণের একটি 16-লম্বা লম্বা ASCII বার গ্রাফ তৈরি করা হবে যাতে মার্বেলগুলি গ্রাফের নীচের দিক থেকে প্রস্থান করবে, যাতে বৃহত্তর সম্ভাবনাটি সমস্ত 16 টি অক্ষরকে কভার করে। সুতরাং নিম্নলিখিত সমস্যার জন্য:

|     O     |
|     ^     |
|    ^ ^    |
|   ^ ^ ^   |
|  ^ ^ ^ ^  |
| ^ ^ ^ ^ ^ |

আপনার প্রোগ্রামটির নিম্নলিখিত সমাধানগুলি উত্পন্ন করা উচিত (নোট করুন যে এটির পাশের পাইপগুলি সহ ইনপুট প্রোগ্রামের মতো একই প্রস্থের হওয়া উচিত:

     # #     
     # #     
     # #     
     # #     
     # #     
     # #     
     # #     
     # #     
   # # # #  
   # # # #  
   # # # #  
   # # # #  
   # # # #  
   # # # #  
 # # # # # #
 # # # # # # 

উদাহরণ

নিম্নলিখিতটি একটি ক্ষেত্রের সমস্ত ধরণের কার্যকারিতা পরীক্ষা করার জন্য একটি উদাহরণ:

|     O     O         |
|  O  ^ /  <^\\\      |
|    ^ >            ^ |
|   ^ ^ ^            =|
|  ^ ^ | ^    <^   O  |
| ^ > ^ | ^   O ^> v  |
||  ^U  ^  |  =    ^\ |
|  ^ ^ ^ ^U ^\ ---^   |
| = ^   ^     =    v  |

এটি নিম্নলিখিত আউটপুট ফলাফল করা উচিত:

                     # 
                     # 
                     # 
                     # 
                   # # 
                   # # 
                   # # 
       # #         # # 
       # #         # # 
       # #         # # 
       # #         # # 
      ## #         # # 
      ## # #       # # 
   # ### # #       # # 
 # # ### # #       # # 
 # # ### # #       # # 

বিধি

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

আরও সৃজনশীল সমাধানের অনুমতি দেওয়ার জন্য, কেবলমাত্র আপনার প্রোগ্রামটি একই চিত্রের জন্য 90% এরও বেশি সময় ধরে সঠিক ফলাফলকে আউটপুট করা প্রয়োজন। এটি সর্বোপরি একটি সম্ভাবনা সিমুলেশন।

স্কোরিং

এটি , তাই বাইট জিতে সর্বনিম্ন স্কোর।


অনেক সহজ কিন্তু সম্পর্কিত
পিটার টেলর

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

তাই v= [space]?
l4m2

@ l4m2 vএবং توپগুলি [space]কীভাবে তাদের চারপাশে যোগাযোগ করে তার মধ্যে পৃথক dif
সেন্সরযুক্ত ব্যবহারকারী নাম

উত্তর:


8

পাইথন 3 , 431 429 410 বাইট

def t(a):e=enumerate;p=a.split("\n");o=[0]*len(p[0]);{m(i,j,p,o,1):m(i,j,p,o,-1)for i,r in e(p)for j,c in e(r)if"O"==c};[print("".join(" #"[round(16*r/max(o)+i)>15]for r in o))for i in range(16)]
def m(r,k,p,o,l,x=1):
 while r<len(p):
  c=p[r][k]
  if"^"==c:x/=2;m(r,k-l,p,o,l,x)
  if"U"==c:return
  if c in" vO":r+=1;continue
  l=[1,l,-1,l,-l,1][ord(c)%6];k-=l
  while";"<c<"?"and p[r][k]in" O-":k-=l
 o[k]+=x

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

এই উত্তরটি হুইট উইজার্ড এবং সেন্সরড ইউজারনেমের মধ্যে সম্মিলিত প্রচেষ্টা। রেফারেন্সের জন্য, এটি হ'ল বিভক্ত অ্যালগরিদম।

মিঃ এক্সকোডার থেকে -2 বাইট

সেন্সরড ইউজারনেম থেকে -19 বাইট


-২ বাইট যদি আপনি পাইথন 2 (মুদ্রণ বিবৃতি) এ স্যুইচ করেন?
কেয়ার্ড কোইনারিংহিংহ

1
এর মধ্যে বলা হয়েছিল: but I can confirm it's doable in 519 characters of python 3 code ;) I don't think I can golf mine much more- সেন্সরযুক্ত ব্যবহারকারী নাম
স্টিফেন

আমি যখন বললাম তখন আমি নিরাশ হয়েছি। এটি বলেছিল, গল্ফিং নিশ্চিতকরণ নিশ্চিত করা বেশ মজাদার ছিল। এছাড়াও @cairdcoinheringaahing, অজগর 2 এর মুদ্রণ বিবৃতিটি একটি বিবৃতি, কোনও অভিব্যক্তি নয় এবং এটি একটি তালিকা বোধের জন্য ব্যবহার করা যায় না। এর অর্থ হ'ল উপরের অনলাইনারটিকে কয়েকটি ইন্ডেন্টেড লাইনে বিভক্ত করতে হবে যা এটিকে অপসারণ থেকে 2 বাইট লাভ করতে পারে।
সেন্সরযুক্ত ব্যবহারকারীর নাম

4

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

i=raw_input
l=i()
c=[]
while l:c,l=c+[l],i()
p=[[0]*len(l)for l in c]+[[0]*max(map(len,c))]
S=lambda r,C,p:r>=0and C>=0and r<len(p)and C<len(p[r])
def U(r,C,P,D,N=0):
 if S(r,C,p):p[r][C]+=P
 if S(r,C,c):
	K=c[r][C]
	if K in' O':U(r+1-N,C+D*N,P,D,N)
	elif'v'==K:U(r+1,C,P,D)
	elif'-'==K:U(r,C+D,P,D,N)
	elif'^'==K:U(r,C-1,P/2,-1);U(r,C+1,P/2,1)
	elif'/'==K:U(r,C-1,P,-1)
	elif'\\'==K:U(r,C+1,P,1)
	elif'='==K:U(r,C+D,P,D,1)
	elif'>'==K:U(r,C+1,P,1,1)
	elif'<'==K:U(r,C-1,P,-1,1)
	elif'|'==K:U(r,C-D,P,-D)
for r in range(len(c)):
 for C in range(len(c[r])):
	if'O'==c[r][C]:U(r+1,C,1.,1);U(r+1,C,1.,-1)
p=p[-1][::-1]
s=16/max(p)
f=['#'*min(int(n*s),16)+' '*min(int(16-n*s),16)for n in p]
print('\n'.join(map(''.join,zip(*f)))[::-1])

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

-১air বাইটস কেয়ারড কোইনারিংহাহিংকে ধন্যবাদ

-12 বাইট ধন্যবাদ নাথান শিরাইনিকে

মিশ্র ইন্ডেন্টেশন (পাইথন 2) এ স্যুইচ করে -56 বাইট

-২৮ সেন্সরড ইউজারনেমকে ধন্যবাদ, কারণ শেষ পর্যন্ত সম্ভাবনাগুলি স্বাভাবিক হয়ে যায়, তাই শেষের সম্ভাবনাগুলি সর্বদা 1 পর্যন্ত যোগ করা প্রয়োজন নয়।

-7 বাইটস একটি সংক্ষিপ্ত সমাপ্তি elifবিবৃতি ব্যবহার করে ক্যালকুলেটর ফিলাইনকে ধন্যবাদ ।

দুটি ফাংশন মার্জ করে -218 বাইট



ঠিক আছে, ধন্যবাদ
হাইপারনিউটারিনো

2
কল Rএবং Lলাইক R(r+1-N,C+N,P,N=N)(প্রথম কল R) এ, আপনার N=শেষের দরকার নেই; এটি R(r+1-N,C+N,P,N)পরিবর্তে হওয়া উচিত ।
নাথান।ইলিশা শিরাইনি

@ নাথানশিরেনি ঠিক আছে, ধন্যবাদ
হাইপারনিউটারিনো

... আপনি কিছু ভুলে গেছেন। উভয়ের শেষ 2 লাইন Lএবং R^^ এছাড়াও, আপনার দ্বিতীয় স্তরের ইন্ডেন্টেশন সর্বত্র 4 টি স্পেস, আমি মনে করি আপনি এটি 2 তৈরি করতে পারেন
নাথান .লিশা শিরাইনি

3

সি, 569 568 556 বাইট

Golfed

#define A s[1]
#define c(i,j,k) break;case i:x=j;y=k;
w,S,i,j,d,x,y,z;main(int*a,char**s){w=strchr(&A[1],'|')+2-A;a=calloc(w,4);for(;i++<'~~';j=0){for(;A[j];){if(A[z=j++]==79){d=rand()%2;x=4;y=7;z+=w;for(;z<strlen(A);){z+=x%3-1+(y%3-1)*w;switch(A[z]){case 85:goto e;c(32,x/3*(3+1),y/3*(3+1))c(45,d*2+3,7)c(94,(d=rand()%2)*2+3,7)c(118,4,8)c(47,3,7)d=0;c(92,5,7)d=1;c(124,(d=!d)*2+3,7)c(60,x,y)case 62:d=A[z]/2%2;case 61:x=d*8;y=4;}}a[z%w]++;e:;}}}for(i=-1;++i<w;S=a[i]>S?a[i]:S);for(j=17;j-->1;puts(""))for(i=0;i<w-1;printf("%c",a[i++]*16./S+0.6<j?32:35));}

Ungolfed

//Variable Definitions
//direction - marbles current direction, 0 -> left, 1-> right
//arrwidth - width of array
//x - change in x of marble in base 3 - 0 -> Left, 1 -> stay, 2-> right
//y - change in y of marble in base 3 - 0 -> Up, 1 -> stay, 2-> Down
//z - position of marble
//i - iterator on runs of program
//j - iterator on string
//k - iterator on outputstring
//argc - array holding all buckets

#define c(i,j,k) break;case i:x=j;y=k;

arrwidth,scale,i,j,direction,x,y,z;

main(int *argc, char**argv){
  arrwidth=strchr(&A[1],'|')+2 - A; //get width
  argc=calloc(arrwidth,4);
  for(;i++<'~~';j=0){
    for(;A[j];){
      if(A[z=j++] == 79){ //if it finds an O, start sim
        direction=rand()%2;
        x=4;
        y=7;
        z+=arrwidth;
        for(;z<strlen(A);){
          z+=x%3-1 + (y%3-1)*arrwidth;
          switch (A[z]){
            case 85://marble dies dont record
              goto e;
            c(32,x/3*(3+1),y/3*(3+1)) //case ' '
            c(45,direction*2+3,7)    //case -
            c(94,(direction=rand()%2)*2+3,7)    //case ^
            c(118,4,8)    //case v
            c(47,3,7)    //case /
              direction=0;
            c(92,5,7)   //case '\'
              direction=1;
            c(124,(direction=!direction)*2+3,7)
            c(60,x,y)    //case <
            case 62:    //case >
              direction=A[z]/2%2;
            case 61:  //case =
              x=direction*8;
              y=4;
          }
        }
        argc[z%arrwidth]++;
        e:;
      }
    }
  }
  //get output answer in terms of '#'
  for(i=-1;++i<arrwidth;scale=argc[i]>scale?argc[i]:scale);
  for(j=17;j-->1;puts(""))
    for(i=0; i < arrwidth-1;printf("%c",argc[i++]*16./scale+0.6<j?32:35));
}

সম্পাদনাগুলি

আমার কেস ম্যাক্রো পরিবর্তন করে 12 বাইট সংরক্ষণ করা হয়েছে।

নোট

আমার কোডটি মার্বেলটি কোথায় চলেছে তা নির্ধারণ করতে বেস 3 ইন্টিজারগুলির একটি সিস্টেম ব্যবহার করে এবং পরে (কামান এবং স্টাফের জন্য) নেতৃত্ব দেওয়া হবে determine

আমি চেষ্টা করেছিলাম সেই অজগর সমাধানটি হারাতে হয়েছিল, আমি সত্যিই করেছি।


1
আমি 568 বাইট গণনা; হয়ত আপনি পেছনের নিউলাইন গণনা করেছেন? এবং আমি খারাপ অনুভব করি; সি দ্বারা পাইথন আউটগল্ফড?
জীজ

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