কিউবিক্স, 94 83 82 79 63 56 বাইট
p>q'-?w.uh'e@U7.'hqi?oqB-!ul.-..$WWu_q<o'\;>....6t?.../!@
সম্প্রসারিত:
p > q '
- ? w .
u h ' e
@ U 7 .
' h q i ? o q B - ! u l . - . .
$ W W u _ q < o ' \ ; > . . . .
6 t ? . . . / ! @ . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
নোট
- প্রোগ্রামটি শুরু হলে দোভাষী দ্য ইনপুট ক্ষেত্রটি অক্ষম করে। যেমন, ইনপুটগুলির একটি অসীম স্ট্রিম অসম্ভব। এই প্রোগ্রামটি ইনপুট অক্ষর দ্বারা অক্ষর গ্রহণ করে, সুতরাং এটি যদি এই সীমাবদ্ধতার জন্য না হয় তবে এটি সঠিকভাবে কাজ করবে।
- এই প্রোগ্রামটি স্ট্যাকটি সাফ করে না, এবং এটি খুব দ্রুত অগোছালো হয়ে যায়। যেহেতু এই মেশিনটি আপাতদৃষ্টিতে ব্যবহৃত হবে তা অসীম ইনপুট স্ট্রিম দিতে পারে, সুতরাং এটির অসীম স্মৃতিও রয়েছে বলে ধরে নেওয়া যুক্তিযুক্ত বলে মনে হয়।
- যে কোনও এবং সমস্ত গল্ফিং সহায়তা অনেক প্রশংসা করা হয়।
এটি অনলাইনে চেষ্টা করুন
আপনি প্রোগ্রামটি এখানে চেষ্টা করতে পারেন ।
ব্যাখ্যা
সাধারণ ধারণা
সাধারণ ধারণাটি হ'ল আমরা একটি অক্ষরটি পড়তে চাই এবং তারপরে এটি বিভিন্ন বর্ণের (প্রথমে h
, তারপরে e
, তারপরে l
ইত্যাদি) পরীক্ষা করতে পারি। আমরা যে চরিত্রটি হারিয়েছি তা ট্র্যাক করে রাখতে, আমরা এটি স্ট্যাকের একেবারে নীচে রাখি। যখন আমাদের এটি প্রয়োজন হয়, আমরা সহজেই এটিকে আবার শীর্ষে আনতে পারি।
লুপ পড়ুন / লিখুন
পঠন-লেখার লুপটি কেবল 5 ম লাইন। ব্যবহৃত হয় না এমন সমস্ত অক্ষর নো-অপ্স ( .
) দ্বারা প্রতিস্থাপিত হয়েছে :
. . . .
. . . .
. . . .
@ . . .
' h q i ? o q B - ! u l . - . .
. . . . _ . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
এটি দুটি ভাগে বিভক্ত হতে পারে: পড়া এবং (লেখা এবং চেক করা)। প্রথম অংশে প্রশ্ন চিহ্ন পর্যন্ত নির্দেশাবলী রয়েছে। দ্বিতীয় অংশটি লাইনটির বাকী অংশ। এটি প্রায় লুপ হওয়ার কারণে, আমরা ধরে নিই আমরা একটি স্ট্যাক দিয়ে শুরু করব[...]
@
'hqi?
_
Explanation
'h Push the character code of the h
Stack: [..., 104]
q Send it to the bottom
Stack: [104, ...]
i Read one character of the input (-1 for EOF)
Stack: [104, ..., input]
? Start of condition:
if (input < 0):
@ execute '@', ending the program
if (input = 0):
continue going right
if (input > 0):
_ turn to the right, reflect back ('_') and
turn right again, effectively not changing
the direction at all
দ্বিতীয় অংশটি (লেখা এবং পরীক্ষা করা) আবার লিনিয়ার। স্ট্যাকটি শুরু হয় [next-char, ..., input]
। আমরা পরবর্তী চরিত্রটিকে বিমূর্ত করেছি, কারণ প্রোগ্রামে এটি পরে পরিবর্তিত হয়।
oqB-!ul.- Explanation
o Output the character at the top of the stack
q Send the input to the bottom of the stack
Stack: [input, next-char, ...]
B Reverse the stack
Stack: [..., next-char, input]
- Push the difference of the top two characters, which
is 0 if both are equal, something else otherwise
Stack: [..., next-char, input, diff]
! if (diff = 0):
u make a u-turn to the right
else:
l. execute two no-ops
- push [input - next-char - input], which is disregarded
later, so it effectively is a no-op as well.
এখন, আইপিটি এই লুপটির শুরুতে আবার শুরু হবে, যাচাই করতে পরবর্তী অক্ষরটি পুনরায় সেট করুন h
।
পরের চরিত্রটির সাথে মিলছে
আইপি যদি কোনও ইউ-টার্ন তৈরি করে (যেমন আমরা যে অক্ষরটি পড়ি এবং মুদ্রিত করে পরবর্তী অক্ষরটির সাথে মেলে 'hello'
), আমাদের ইনপুটটি কোন অক্ষরটি ছিল এবং তার উপর নির্ভর করে পরবর্তী অক্ষরটিকে স্ট্যাকের নীচে টানুন check এর পরে, আমাদের h
স্ট্যাকের দিকে চাপ না দিয়ে পঠন / লেখার লুপটিতে ফিরে আসা দরকার, সুতরাং সেখানে পৌঁছানোর জন্য আমাদের আরও একটি উপায় প্রয়োজন।
প্রথম জিনিসগুলি: ইনপুটটি কী চরিত্র তা নির্ধারণ করুন। স্ট্যাক ভালো দেখায়: [..., prev-char, input, 0]
।
. . . .
- ? . .
u h ' e
. . . .
. . . . . . . . . ! u . . . . .
. . . . . . . . . \ ; . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
ইনপুট তুলনা করতে, আমরা h
আবার অক্ষর কোড ব্যবহার । প্রথমদিকে, এটি ছিল কারণ আমি সত্যিই জানতাম না যে আমি কীভাবে এটি পরিচালনা করব এবং h
এটি যাচাই করার জন্য স্ট্রিংয়ের প্রথম চরিত্র, তবে এটি যথেষ্ট সুবিধাজনক বলে শেষ হয়েছিল। আমরা যদি ইনপুট থেকে h এর অক্ষর কোডটি বিয়োগ করি -3
তবে আমরা পাই যদি ইনপুট হয় e
, 0
যদি ইনপুট হয় h
, 4
যদি ইনপুট থাকে l
এবং 7
যদি ইনপুট হয় o
।
এটি দরকারী, কারণ ?
কমান্ডটি আমাদের সহজেই নেতিবাচক মানকে ধনাত্মক মান এবং শূন্য থেকে আলাদা করতে দেয়। যেমন, আইপি বাম দিকে ঘুরলে, পার্থক্যটি নেতিবাচক ছিল e
, সুতরাং ইনপুটটি ছিল , সুতরাং পরবর্তী অক্ষরটি একটি হওয়া উচিত l
। আইপি যদি সোজা চলে যেতে থাকে তবে পার্থক্য ছিল 0
, সুতরাং ইনপুটটি ছিল h
তাই পরবর্তী অক্ষরটি একটি হওয়া উচিত e
। যদি ইনপুটটি একটি l
বা একটি হয় o
, আইপি ডান দিকে ঘুরবে।
পূর্বোক্ত প্রশ্ন চিহ্নের আগে কার্যকর করা সমস্ত নির্দেশাবলী হ'ল:
;!e'h- Explanation
; Delete the top of the stack
Stack: [..., prev-char, input]
! if (input = 0):
e execute 'e' (no-op)
'h Push the character code of h
Stack: [..., prev-char, input, 104]
- Push the difference of the input and 104
Stack: [..., prev-char, input, 104, diff]
উপরে বর্ণিত আইপি এখন তার দিক পরিবর্তন করে। আসুন বিভিন্ন সম্ভাবনার উপর দিয়ে যাওয়া যাক।
ইনপুট 'e'
প্রথমে আমরা ইনপুটটি বিবেচনা করব e
, যার ফলে আইপিটি উপরের দিকে উপরে চলে যায় ?
, পার্থক্যটি 3 হওয়ায় সমস্ত অপ্রাসঙ্গিক অক্ষর কিউব থেকে সরানো হয়েছে।
. > q '
. ? . .
. . . .
. . . .
. . q . . . . . . . . l . . . .
$ W W . . . . . . . . > . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
অক্ষরগুলি এই ক্রমে কার্যকর করা হয় (কিছু নিয়ন্ত্রণ-প্রবাহের অক্ষরগুলি বাদ দিয়ে):
q'l$WWq
q Save the difference (-3) to the bottom of the stack so
we can tell whether the l on the bottom of the stack is
the first or the second l in hello
Stack: [-3, ...]
'l Push the character code of l to the stack
Stack: [-3, ..., 108]
$W no-op
W Sidestep into the loop
q Send the character code to the bottom
Stack: [108, -3, ...]
এখন আইপি আবার পঠন / লেখার লুপে পৌঁছেছে।
ইনপুট 'h'
যদি ইনপুটটি ছিল 'h'
, পার্থক্য 0, সুতরাং আইপি তার দিক পরিবর্তন করে না। সমস্ত অপ্রাসঙ্গিক অক্ষর মুছে ফেলা দিয়ে আবার কিউবটি এখানে। যেহেতু এই পথে বেশ কয়েকটি নো-অপস অন্তর্ভুক্ত রয়েছে, তাই এটি পাস করা সমস্ত নো-অপস দ্বারা প্রতিস্থাপন করা হয়েছে &
। আইপি শুরু হয় প্রশ্ন চিহ্ন থেকে।
. . . .
. ? w .
. . ' e
. . . .
. . . . . . . . . ! . . . . . .
. . . u _ q < . . \ . . . . . .
. . ? & & & / . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
সম্পাদিত নির্দেশাবলী হ'ল:
'e!\?q_
'e Push the character code of the e
Stack: [..., 101]
! if (101 = 0):
\ reflect away (effectively a no-op)
? if (101 > 0):
turn right (always happens)
q Move 101 to the bottom of the stack
Stack: [101, ...]
_ No-op
এবং এখন আমরা আবার পড়ুন / লেখার লুপটি প্রবেশ করিয়েছি, সুতরাং আমরা সম্পন্ন করেছি।
অন্যান্য ইনপুট
অন্যান্য সমস্ত ইনপুটগুলি ইতিবাচক পার্থক্যের ফলস্বরূপ, তাই আইপিটি প্রশ্ন চিহ্নের ডানদিকে ফিরে আসে। আমরা এখনও আলাদা করতে প্রয়োজন l
এবং o
যাতে এর পরবর্তিতে আমরা কি করব।
'l'
এবং পৃথক করা'o'
মনে রাখবেন যে পার্থক্যটি 7 o
এবং 4 এর জন্য 4 l
এবং ইনপুটটি যদি একটি হয় তবে আমাদের প্রোগ্রামটি শেষ করতে হবে o
। এখানে আবার কিউবটি অপ্রাসঙ্গিক অংশগুলির সাথে একটি .
দ্বারা প্রতিস্থাপন করা হয়েছে এবং আইপি ক্রসগুলি অ্যাম্পারস্যান্ড দ্বারা প্রতিস্থাপন করা হয়েছে এবং নো-অপসগুলি রয়েছে।
. . q .
. ? w .
. h ' .
. U 7 .
. . . . . . . . . . . . . - . .
. . . . . . . . . . . . . & . .
. . . . . . / ! @ . . . . & . .
. . . . . . & . . . . . . & . .
. . & .
. . & .
. . & .
. . & .
h7'wq-!@
h no-op
7 Push 7 to the stack
Stack: [..., diff, 7]
'wq Push w to the stack and send it to
the bottom. We don't care about it,
so it's now part of the ellipsis.
Stack: [..., diff, 7]
-! if (diff = 7):
@ End the program
দুই মধ্যে নির্ণায়ক 'l'
গুলি
সুতরাং, এখন আমরা জানি যে ইনপুটটি ছিল একটি l
, তবে আমরা জানি না কোনটি l
। এটি যদি প্রথম l
হয় তবে আমাদের স্ট্যাকের নীচে আরেকটি ধাক্কা দিতে হবে, তবে এটি দ্বিতীয় হলে আমাদের একটি ধাক্কা দিতে হবে o
। মনে আছে আমরা -3
প্রথমটি ধাক্কা দেওয়ার ঠিক আগে আমরা স্ট্যাকের নীচে সংরক্ষণ করেছি l
? আমরা দুটি শাখা পৃথক করতে এটি ব্যবহার করতে পারি।
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
6 t ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
স্ট্যাকটি শুরু হয় [..., -3 or 140, ...]
Explanation
6t?
6t Take the 6th item from the top and move
it to the top (which is either -3 or 140)
? If that's positive, turn right, otherwise,
turn left
প্রথম 'l'
এটি যদি প্রথম ছিল তবে 'l'
আমাদের আরও একটি ধাক্কা দেওয়া দরকার 'l'
। বাইট সংরক্ষণ করতে, আমরা প্রথমটির মতো একই অক্ষর ব্যবহার করি 'l'
। আমরা স্ট্যাকটি সরল করতে পারি [...]
। এখানে কিউবারের প্রাসঙ্গিক অংশটি অ্যাম্পারস্যান্ডগুলি দ্বারা প্রতিস্থাপনের সাথে নেই op
p > q '
. . . .
. . . .
. . . .
' . q . . . . . . . . l . . . .
$ W W . . . . . . . . > & & & &
. . ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
নিম্নলিখিত নির্দেশাবলী কার্যকর করা হয়:
$'pq'lq
$' no-op
pq no-op
'l Push the character code of l
Stack: [..., 108]
q Send it to the bottom
Stack: [108, ...]
আমরা পঠন / লেখার লুপটি লিখতে চলেছি, সুতরাং আমরা এই শাখাটি দিয়ে শেষ করেছি।
দ্বিতীয় 'l'
যদি ইনপুটটি দ্বিতীয়ত 'l'
ছিল 'hello'
, আইপিটি প্রশ্ন চিহ্নের ডানদিকে ঘুরে গেছে। আবার, আমরা স্ট্যাকটিকে সহজ করতে পারি [...]
এবং আইপি শুরু হয় ?
, এবার দক্ষিণ দিকে ইশারা করে।
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . .
. . . u _ q < o ' \ . . . . . .
. . ? . . . . . . & . . . . . .
. . & . . . . . . & . . . . . .
. . . .
& & & &
. . . .
. . . .
সম্পাদিত নির্দেশাবলী হ'ল:
'oq_
'o Push the character code of 'o'
Stack: [..., 111]
q Move the top item to the bottom
Stack: [111, ...]
_ No-op
এবং আইপি আবার পড়তে / লেখার লুপটি প্রবেশ করতে চলেছে, সুতরাং আমরা এই শাখাটি দিয়েও শেষ করেছি।