एक (गुरुत्वाकर्षण-आधारित) बिलियर्ड-बॉल-प्रकार के कंप्यूटर का अनुकरण करें


12

यंत्र

एक बिलियर्ड-बॉल टाइप मशीन केवल प्रतीकों \ _ /के साथ-साथ ऊपरी और निचले-मामले वाले अक्षरों, रिक्त स्थान और संख्या से बना है 1

\और /रैंप हैं। ऊपर से आने वाली एक गेंद को क्रमशः दाईं या बाईं ओर झुका दिया जाएगा। दोनों रैंप के लिए, यदि कोई गेंद दोनों ओर से आती है, तो उसे नीचे की ओर झुका दिया जाएगा।

_एक तर्क तत्व है। इसके द्वारा किया जाने वाला तर्क कंप्यूटर का सबसे अन-बिलियर जैसा हिस्सा है। सबसे पहले, बाएं या दाएं से आने वाली गेंद उसी दिशा में जारी रहती है। ऊपर से आने वाली एक गेंद को रोका जाएगा। फिर, इसके निष्पादन के अंत के बाद (नीचे मशीन चलाना) देखें, यदि गेंदों की संख्या इस पर पार / लैंडिंग सकारात्मक है, तो एक भी गेंद तत्व के नीचे से जारी की जाती है।

एक अंतरिक्ष कुछ भी नहीं करता है। किसी भी दिशा से आने वाली कोई भी गेंद गुरुत्वाकर्षण के कारण सीधे नीचे गिरती है।

लोअरकेस अक्षर इनपुट हैं। सभी इनपुट या तो 1 या 0 होंगे।

अपरकेस अक्षर आउटपुट हैं। आउटपुट संख्या बिलबोर्ड बॉल्स की संख्या होगी जो इसके स्थान को हिट करती है।

संख्या 1उस स्थान पर एक अतिरिक्त बिलियर्ड-बॉल जारी करती है। यह एक तार्किक 1 का प्रतिनिधित्व करता है।

\_/गुरुत्वाकर्षण के कारण किसी भी दिशा से आने वाली किसी भी गेंद के सीधे गिरने के अलावा सभी पात्र ।

बॉल्स कभी संयोजित, विभाजित या टकराते नहीं हैं। वे केवल तब बनाए जाते हैं जब किसी इनपुट _, या , ए से जारी किए जाते हैं 1। वे केवल तब नष्ट हो जाते हैं जब वे सीधे a पर गिरते हैं _

उदाहरण मशीन-

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

लक्ष्य

आपका लक्ष्य STDIN से एक मशीन लेना है और STDOUT को आवश्यकतानुसार इनपुट और प्रिंटिंग आउटपुट लेकर इसे अनुकरण करना है। आपके प्रोग्राम के लिए इनपुट का पहला भाग मशीन को चलाने के लिए होगा, उसके बाद एक खाली लाइन होगी। किसी भी इनपुट पत्र का सामना करना पड़ता है जो आपके प्रोग्राम को इनपुट नाम के रूप में एक कोलन द्वारा पीछा करने के लिए संकेत देता है। किसी भी आउटपुट को आउटपुट नाम के रूप में दिखाया जाना चाहिए, उसके बाद एक कोलन, उसके बाद उस स्थान पर गुजरने वाली गेंदों की संख्या।

यह गोल्फ है।

उदाहरण

एक तार पार करना

ab
\/
AB

एक XOR गेट

ab1
\_/
 C

एक पूर्ण योजक

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

आपके पहले उदाहरण में, पहली गेंद A के नीचे क्यों गिरती है? क्या एक अलिखित नियम है कि जब वे एक पात्र पर पास करते हैं तो गेंदें रुक जाती हैं \_/?
पीटर टेलर

@PeterTaylor हां, मुझे यह जोड़ना चाहिए कि जब गेंद को प्रभावित करने की बात आती है तो सभी पत्र एक खाली जगह के रूप में व्यवहार करते हैं, और गुरुत्वाकर्षण गेंद को नीचे खींचता है।
PhiNotPi

1
क्या आप किसी भी तरह से 'फ्लिपर' से मतलब रखते हैं, 'बिलार्ड' से नहीं?
उपयोगकर्ता अज्ञात


1
@AlexL। इसके अलावा प्रासंगिक: Marbelous
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

विफल:

- अगली पंक्ति में # गेंदों को # ट्रैक करता है r, nअगली पंक्ति में गेंदों का # ट्रैक करता है।
- एल्गोरिथम: प्रत्येक पंक्ति वर्ण को वर्ण द्वारा संसाधित करें, लेकिन प्रक्रिया _अंतिम है।
- एल्गोरिथ्म: \-> पालन करें _और rगैर तक बढ़ाएँ- _। उसी के लिए /लेकिन रिवर्स दिशा में। nगुरुत्वाकर्षण के लिए अंत में वृद्धि गेंदों को नीचे खींचती है। gदिशा रखती है।
- एडिट 1if(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आउटपुट के लिए उपयोग कर रहा हूं जो जावास्क्रिप्ट के लिए बहुत ही मानक है :-)
mellamokb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.