আত্মা Befinge জন্য স্থগিত সমস্যা সমাধানের , এর অন্য 2D ভাষা বলা সংজ্ঞায়িত করি Modilar SNISP । মডিলার এসএনআইএসপির নিম্নলিখিত ছয়টি নির্দেশনা রয়েছে:
\
নির্দেশিকা নির্দেশককে নিম্নলিখিতভাবে নির্দেশ দেয়:- যদি উপরে থেকে যোগাযোগ করা হয় তবে ডানদিকে যান;
- যদি ডান দিক থেকে কাছে পৌঁছে যায় তবে উপরে যান;
- নীচ থেকে যদি যোগাযোগ করা হয় তবে বাম দিকে যান;
- যদি বাম দিক থেকে যোগাযোগ করা হয় তবে নীচে যান।
/
নির্দেশিকা নির্দেশককে নিম্নলিখিতভাবে নির্দেশ দেয়:- যদি উপরে থেকে যোগাযোগ করা হয় তবে বাম দিকে যান;
- যদি বাম দিক থেকে কাছে যায় তবে উপরে যান;
- নীচ থেকে যদি যোগাযোগ করা হয়, ডানদিকে যান;
- যদি ডান দিক থেকে যোগাযোগ করা হয় তবে নীচে যান।
!
পরবর্তী নির্দেশাবলী এড়িয়ে যান।@
আইপি অবস্থান এবং দিকটি কল স্ট্যাকের দিকে ঠেলে দেয়।#
কল স্ট্যাক থেকে একটি আইপি অবস্থান এবং দিক পপ করে এবং সেগুলি পুনরুদ্ধার করে, তারপরে পরবর্তী নির্দেশাবলী এড়িয়ে যায়। যদি কল স্ট্যাকটি খালি থাকে, কার্যকর করা বন্ধ হয়ে যায়।.
কিছুই করে না
উপরের বাম কোণে ডানদিকে যাবার নির্দেশ নির্দেশকটি শুরু হয়। যদি এটি কখনও প্লেফিল্ড ছেড়ে যায়, কার্যকর করা বন্ধ হয়ে যায়।
মডিলার এসএনআইএসপি পিডিএর চেয়ে বেশি শক্তিশালী হতে পারে না , কারণ এটি আনবাউন্ডেড স্টোরেজের একমাত্র উত্স একটি সীমাবদ্ধ (কল স্ট্যাক) একটি সীমাবদ্ধ বর্ণমালা (সমস্ত আইপি (অবস্থান, দিকনির্দেশ) জোড়া) এর সেট। থামার সমস্যা পিডিএগুলির জন্য নির্ধারিত , সুতরাং এই চ্যালেঞ্জটি সর্বদা সম্ভব হওয়া উচিত।
চ্যালেঞ্জ
আপনার লক্ষ্য হ'ল এমন একটি প্রোগ্রাম লিখুন যা কোনও মডিলার এসএনআইএসপি প্রোগ্রামের প্রতিনিধিত্ব করে এমন অক্ষরের একটি ম্যাট্রিক্স গ্রহণ করে এবং এটি থামবে কি না তার উপর নির্ভর করে দুটি স্বতন্ত্র আউটপুটগুলির মধ্যে একটি প্রদান করে।
এটি কোড-গল্ফ , তাই সংক্ষিপ্ততম বৈধ প্রোগ্রাম ( বাইটে পরিমাপ করা ) জয়ী।
বিশেষ উল্লেখ
- চরিত্রের ম্যাট্রিক্সটি আপনি যেভাবে নেবেন তা নমনীয়: একটি নতুনলাইন-পৃথক স্ট্রিং, স্ট্রিংগুলির অ্যারে, অক্ষরের অ্যারে, 2 ডি বর্ণের অ্যারে, প্রস্থের উপস্থাপিত পূর্ণসংখ্যার সাথে অক্ষরের সমতল অ্যারে ইত্যাদি সমস্ত গ্রহণযোগ্য। পরীক্ষার কেসগুলি সেই পছন্দগুলির মধ্যে প্রথমটি বেছে নেয়।
- আপনি ধরে নিতে পারেন যে ইনপুট ম্যাট্রিক্সটি আয়তক্ষেত্রাকার হবে (যাতে আপনাকে ছোট সারি প্যাড করতে হবে না) এবং ননজারো দৈর্ঘ্য এবং প্রস্থের হবে।
- আপনি যে কোনও দুটি স্বতন্ত্র আউটপুট চয়ন করতে পারেন, কেবল সত্যবাদী / মিথ্যা নয়।
- আপনি অনুমান করতে পারেন যে ইনপুট ম্যাট্রিক্স শুধুমাত্র বৈধ কমান্ড গঠিত হবে (
\
,/
,!
,@
,#
, এবং.
)। - যখন কোনও আদেশ "পরবর্তী নির্দেশাবলী এড়িয়ে চলুন" বলা হয়, আপনি ধরে নিতে পারেন যে পরবর্তী পদক্ষেপ এড়াতে হবে। বিশেষত, এটি এমন পরিস্থিতিতে কখনও মুখোমুখি হবে না যেখানে (১) এটি প্লেফিল্ডের প্রান্তে অবস্থিত এবং (২) আইপিটি সেই প্রান্তে লম্ব প্রান্তরে চলেছে, যেমন "খেলার পরবর্তী ক্ষেত্রের বাইরে" পরবর্তী নির্দেশ "field"
পরীক্ষার কেস
নিম্নলিখিত স্নিপেট ভাষাতে প্রোগ্রামগুলি পরীক্ষা করতে ব্যবহার করা যেতে পারে। মনে রাখবেন যে সামান্য এখানে দেওয়া প্রকৃত স্পেসিফিকেশন চেয়ে বেশি প্রশ্রয়ের (যেমন এটা অক্ষরের চেয়ে অন্যান্য অনুমতি দেয় .
নো অপস হিসাবে)।
function htmlEscape(t){let i=document.createElement("span");return i.innerText=t,i.innerHTML}function tick(){snisp.tick(),snisp.update()}function run(){runButton.style.display="none",stopButton.style.display="",code.style.display="none",executionArea.style.display="",snisp.initialize(),intervalId=setInterval(tick,INTERVAL_MS)}function stop(){runButton.style.display="",stopButton.style.display="none",code.style.display="",executionArea.style.display="none",clearInterval(intervalId)}let TICKS_PER_SECOND=5,INTERVAL_MS=1e3/TICKS_PER_SECOND,runButton=document.getElementById("run-button"),stopButton=document.getElementById("stop-button"),code=document.getElementById("code"),executionArea=document.getElementById("execution-display"),intervalId,snisp={x:null,y:null,direction:null,callStack:null,stopped:null,playfield:null,padRows:function(){let t=Math.max(...this.playfield.map(t=>t.length));for(let i=0;i<this.playfield.length;i++)this.playfield[i]=this.playfield[i].padEnd(t,".")},initialize:function(){this.x=0,this.y=0,this.direction="right",this.callStack=[],this.stopped=!1,this.playfield=code.value.split("\n"),this.padRows(),this.update()},getCurrentChar:function(){let t=this.playfield[this.y];if(void 0!=t)return t[this.x]},backslashMirror:function(){let t={up:"left",right:"down",down:"right",left:"up"};this.direction=t[this.direction]},slashMirror:function(){let t={up:"right",right:"up",down:"left",left:"down"};this.direction=t[this.direction]},forward:function(){switch(this.direction){case"up":this.y-=1;break;case"down":this.y+=1;break;case"left":this.x-=1;break;case"right":this.x+=1;break;default:throw"direction is invalid"}},pushState:function(){this.callStack.push({x:this.x,y:this.y,direction:this.direction})},restoreState:function(){let t=this.callStack.pop();void 0!=t?(this.x=t.x,this.y=t.y,this.direction=t.direction):this.stopped=!0},tick:function(){if(this.stopped)return;let t=this.getCurrentChar();if(void 0!=t){switch(t){case"\\":this.backslashMirror();break;case"/":this.slashMirror();break;case"!":this.forward();break;case"@":this.pushState();break;case"#":this.restoreState(),this.forward()}this.forward()}else this.stopped=!0},generatePlayfieldHTML:function(t,i){let e=[];for(let n=0;n<this.playfield.length;n++){let s=[],l=this.playfield[n];for(let e=0;e<l.length;e++){let a=htmlEscape(l[e]);e==t&&n==i&&(a='<span class="highlight">'+a+"</span>"),s.push(a)}e.push(s.join(""))}return e.join("<br>")},update:function(){let t=[];for(let i=0;i<this.callStack.length;i++){let e=this.callStack[i];t.push(this.generatePlayfieldHTML(e.x,e.y))}t.push(this.generatePlayfieldHTML(this.x,this.y));let i=t.join("<br><br>");executionArea.innerHTML=i}};
#code{font-family:monospace;}#execution-display{font-family:monospace;white-space:pre;}.highlight{background-color:yellow;}
<b>Code:</b><br/><textarea id="code" width="300" height="300"></textarea><br/><button id="run-button" onclick="run()">Run</button><button id="stop-button" onclick="stop()" style="display: none;">Stop</button><br/><div id="execution-display"></div>
অসম্পূর্ণ ফর্মটি এখানে পাওয়া যাবে ।
স্থগিত
.
সম্ভব সবচেয়ে ছোট প্রোগ্রাম। ডান বাইরে যায়।
\\
\/
প্রোগ্রামের চারপাশে বাতাস এবং শীর্ষে চলে যায়।
.\./.\
.\!/./
লুপে যায়। দুটি পৃথক দিকের ট্র্যাকের অংশ দিয়ে বাতাস।
@\!/#
.\@/#
সমস্ত ছয়টি কমান্ড ব্যবহার করে।
@.@.@.@.@.@.@.@.@.#
এই প্রোগ্রামটির সম্পাদনের সময়টি পুনরাবৃত্তির সংখ্যায় তাত্পর্যপূর্ণ @.
তবে এটি এখনও থেমে আছে।
অ স্থগিত
!/\
.\/
আমি বিশ্বাস করি এটি হ'ল সংক্ষিপ্ততম অসীম লুপ।
@!\\#/@\!\
//@//.#./.
.\#.!\./\.
#.\!@!\@//
/..@.@\/#!
\.@.#.\/@.
ট্র্যাকের চারপাশে এই বাতাসগুলি স্ট্যাকের ফ্রেমগুলি মাঝে মাঝে সজ্জিত করে অবশেষে একটি চক্রের মধ্যে ধরা পড়ার আগে অসীমভাবে স্ট্যাক ফ্রেম তৈরি করে। সমস্ত কমান্ড আসলে ব্যবহার করা হয় না।
.!/@.@.@.@.@.\
/.@.@.@.@.@.@/
\@.@.@.@.@.@.\
/.@.@.@.@.@.@/
.@\@.@.@.@.@.\
\.@.@.@.@.@.@/
স্ট্যাক ফ্রেম তৈরি করে রাখে, তবে তাদের কেউই আর ফিরে আসে না।