একটি (মাধ্যাকর্ষণ-ভিত্তিক) বিলিয়ার্ড-বল-টাইপ কম্পিউটারের অনুকরণ করুন


12

যন্ত্র

একটি বিলিয়ার্ড-বল টাইপ মেশিনটি কেবলমাত্র চিহ্নগুলির \ _ /সাথে উপরের এবং নিম্ন-অক্ষরের অক্ষর, স্পেস এবং সংখ্যার সমন্বয়ে গঠিত 1

\এবং /র‌্যাম্পগুলি উপরের দিক থেকে আসা একটি বল যথাক্রমে ডান বা বাম দিকে প্রতিবিম্বিত হবে। উভয় র‌্যাম্পের জন্য, যদি কোনও বল উভয় দিক থেকে আসে তবে এটি নীচের দিকে প্রতিবিম্বিত হবে।

_একটি যুক্তিযুক্ত উপাদান। এটি দ্বারা সম্পাদিত যুক্তিটি কম্পিউটারের সর্বাধিক অ-বিলিয়ার্ড অংশ। প্রথমত, বাম বা ডান দিক থেকে আসা একটি বল একই দিকে অবিরত থাকে। উপর থেকে আসা একটি বল থামানো হবে। তারপরে, এর সম্পাদন শেষ হওয়ার পরে (নীচে মেশিনটি চালানো দেখুন), যদি তার উপরে ক্রসিং / ল্যান্ডিংয়ের সংখ্যা ইতিবাচক এমনকি সংখ্যার হয়, তবে উপাদানটির নীচ থেকে একটি বল ছেড়ে দেওয়া হবে।

একটি স্থান কিছুই করে না। কোনও দিক থেকে আসা কোনও বল মহাকর্ষের কারণে সরাসরি নীচে নেমে আসে।

ছোট হাতের অক্ষরগুলি ইনপুট হয়। সমস্ত ইনপুট হয় একক 1 বা 0 হবে।

বড় হাতের অক্ষর আউটপুট হয়। আউটপুট করা নম্বরটি হ'ল বিলিয়ার্ড বলগুলির সংখ্যা যা তার অবস্থানটিতে আঘাত করে।

নম্বরটি সেই স্থানে 1একটি অতিরিক্ত বিলিয়ার্ড-বল প্রকাশ করে। এটি একটি যৌক্তিক 1 প্রতিনিধিত্ব করে।

সমস্ত অক্ষর ছাড়াও \_/কোনও দিক থেকে যে কোনও বল এসেছিল মহাকর্ষের কারণে সরাসরি নীচে পড়তে পারে।

বলগুলি কখনও একত্রিত হয় না, বিভক্ত হয় না বা সংঘর্ষ হয় না। এগুলি কেবল তখনই তৈরি করা হয় যখন কোনও ইনপুট, ক _, বা এ থেকে মুক্তি দেওয়া হয় 1। এগুলি কেবল তখনই নষ্ট হয়ে যায় যখন তারা সরাসরি নীচে নেমে যায় _

উদাহরণ মেশিন-

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

কোনও মেশিনে কখনই কোনও ফাঁকা লাইন থাকবে না, তবে _এটি ফাঁকা রেখা আছে তা দেখাতে পারে।

মেশিন চালাচ্ছি

একটি মেশিন স্তর বা সারিগুলিতে চালিত হয়। দ্বিতীয় স্তরে কিছু হওয়ার আগে উপরের স্তরের সমস্ত বিলিয়ার্ড-বল চলাচল করা হয়।

যন্ত্র

ab
\_A
 C

নিম্নলিখিত হিসাবে চালানো হয়:

প্রথমত, এটি aফর্মটিতে ইনপুটটির জন্য অনুরোধ করে a:। এরপরে ব্যবহারকারী 1 বা 0 ইনপুট দেবে (প্রবেশের পরে)। এটি ইনপুটটির জন্য এটি পুনরাবৃত্তি করে b। এটি প্রথম স্তরটির শেষ। আমি ধরে নিতে চলেছি যে ব্যবহারকারী উভয় ইনপুট জন্য 1 টি প্রবেশ করিয়েছে।

তখনই প্রথম বল (থেকে পথ খুঁজে ট্রেস a), যা বরাবর যায় \জুড়ে _অনুবাদ করে, এবং A, এবং অধীন ঘটনাস্থলে নিচে পড়ে A। এরপরে এটি দ্বিতীয় বলের (থেকে b) পথ খুঁজে বের করে , যা সরাসরি নীচে গিয়ে _শেষ হয়। এটি দ্বিতীয় স্তরের শেষ।

এখন, তৃতীয় স্তরটির আগে, যেহেতু _এর দুটি বল পেরিয়ে গেছে, এটি একটি বল ছেড়ে দেয়। আউটপুটটির Aউপরে একটি বল ক্রস হয়েছে, সুতরাং এটি আউটপুট করে A:1

তৃতীয় স্তরটির জন্য, এটি প্রথম বলের (টি থেকে _) সন্ধান করে, যা যদিও যায় Cএবং সরাসরি নীচে পড়ে। দ্বিতীয় বল (যা দিয়ে পড়েছিল A)ও সরাসরি নীচে পড়ে।

এখন, চতুর্থ স্তরটির আগে, যেহেতু আউটপুটটির Cউপরে একটি বল ভ্রমণ ছিল, এটি আউটপুট করে C:1

যেহেতু চতুর্থ স্তরটি ফাঁকা, প্রোগ্রামটি সমাপ্ত হয়।

মোট ফলাফল দেখতে হবে

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

লক্ষ

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

এটি গল্ফ।

উদাহরণ

একটি তারের পারাপার

ab
\/
AB

একটি এক্সওআর গেট

ab1
\_/
 C

একটি পূর্ণ সংযোজন

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C

আপনার প্রথম উদাহরণে, কেন প্রথম বলটি এ এর ​​নীচে নেমে আসে? এমন কোনও অলিখিত নিয়ম নেই যে বলগুলি যখন কোনও চরিত্রের কাছে যায় তখন বন্ধ হয় \_/?
পিটার টেলর

@ পিটারটেলর হ্যাঁ, আমার যুক্ত করা উচিত যে বলটি প্রভাবিত করার সময় সমস্ত অক্ষর খালি স্থান হিসাবে আচরণ করে এবং মাধ্যাকর্ষণ বলটি নীচে টান দেয়।
PhiNotPi

1
আপনি কি কোনও সুযোগে 'ফিলিপার' অর্থ, 'বিলার্ড' নয়?
ব্যবহারকারী অজানা

এএসওলং করুন
ম্যাথু রোহ

1
@AlexL। এছাড়াও প্রাসঙ্গিক: মার্বেলাস
PhiNotPi

উত্তর:


3

জাভাস্ক্রিপ্ট ( 392 423)

ধরে নেওয়া যায় মেশিনটি একটি পরিবর্তনশীল নামে ডাকা হয় m, তারপরে চূড়ান্ত আউটপুটটি সতর্ক করে।

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

নমুনা উত্স (অ্যাডারে মেশিন চালায়, কম গল্ফযুক্ত উত্সগুলির জন্য ইতিহাস দেখুন): http://jsfiddle.net/96yLj/12/

spoilers:

- rবর্তমান সারি জুড়ে # টি বল ট্র্যাক করে, nপরের সারি জুড়ে # টি বল ট্র্যাক করে।
- অ্যালগরিদম: প্রতিটি সারি চরিত্রকে অক্ষর অনুসারে প্রক্রিয়া করুন তবে প্রক্রিয়াটি _শেষ।
- অ্যালগরিদম: \-> অনুসরণ করুন _এবং rঅ-অবধি বৃদ্ধি করুন _। একই জন্য /কিন্তু বিপরীত দিকে। nমহাকর্ষের জন্য শেষে বলটি নীচে টানুন increase gদিক ধরে
- সম্পাদনা 1 এif(L[d]>'@'&L[d]<'[')r[d]+=r[c]; উল্লিখিত বাগের জন্য । আমরা কেবল কারণ বলতে পারি না কারণ প্রক্রিয়া করার সময় বলগুলি ডাবল-গণনা করবে - উভয় কেস পরিচালনা করে এবং যা যথাক্রমে 1 এবং 0 তে পরিণত হয়।r[d]+=r[c];\_//
else if(C<'2')'1'' '~~C


সম্পাদনা 1: স্যাম্পল কোডের জন্য _অন্তর্ভুক্ত না করে বল চলার সাথে বাগ ঠিক করুনA


নোট করুন যে আমি সর্বদা STDIN এবং STDOUT প্রয়োজনীয়তা উপেক্ষা করি কারণ তারা আগ্রহী সীমাবদ্ধতা। আমি promptইনপুট এবং alertআউটপুট ব্যবহার করছি যা জাভাস্ক্রিপ্টের জন্য বেশ মান :-)
মেল্লামোকব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.