<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
ইনপুটটি N
স্ট্রিং দ্বারা অনুসরণ করে, কোনও অ-সংখ্যাযুক্ত অক্ষর দ্বারা পৃথক separated
এটি অনলাইন চেষ্টা করুন!
এটি এসপি 3000 এর সহযোগিতায় লিখিত হয়েছিল (যার অর্থ আমি কোনও অ্যালগরিদম বের করার জন্য বিরক্ত হতে পারি না, তাই তিনি এটিতে কাজ শুরু করেছিলেন, 118 বাইট সমাধান নিয়ে এসেছিলেন তবে এটি গল্ফ করে বিরক্ত করা যায় না, তাই আমি গল্ফিং করেছি)। .. টিম ওয়ার্কের জন্য হ্যাঁ)।
ব্যাখ্যা
এসপির সাধারণ প্রাইমার (যথারীতি সামান্য পরিবর্তিত):
- ল্যাবরেথ মূল এবং সহায়ক দুটি স্ট্যাক সহ একটি স্ট্যাক-ভিত্তিক 2D ভাষা। মূল স্ট্যাকের উপর অনেক কিছু ঘটে থাকে তবে আপনি মানগুলি অন্যটির কাছে স্থানান্তর করতে পারেন, উদাহরণস্বরূপ সেগুলি বিপরীত করতে বা পরে সংরক্ষণ করতে পারেন।
- স্ট্যাকগুলি নিবিড় এবং শূন্যে ভরা, তাই খালি স্ট্যাক থেকে পপিং কোনও ত্রুটি নয়।
- সম্পাদন প্রথম বৈধ অক্ষর থেকে শুরু হয় (এখানে শীর্ষে বাম)। প্রতিটি সংযোগে, যেখানে নির্দেশিকা পয়েন্টার (আইপি) গ্রহণের জন্য দুটি বা ততোধিক সম্ভাব্য পাথ রয়েছে, সেখানে স্ট্যাকের শীর্ষটি কোথায় পরীক্ষা করা উচিত তা নির্ধারণ করার জন্য পরীক্ষা করা হয়। নেতিবাচক বাম দিকে ঘুরছে, শূন্য এগিয়ে এবং ধনাত্মক ডান দিকে ঘুরছে turn কোডটি উইন্ডিং, টুইস্টি প্যাসেজগুলির মতো দেখানোর উদ্দেশ্যে বোঝানো হয়েছিল , তবে "কক্ষগুলি" তৈরি করতে আপনাকে বিরত করার কিছুই নেই যেখানে প্রতিটি কক্ষে এই শর্তগুলি পরীক্ষা করা হয়। এগুলি বেশ অনাকাঙ্ক্ষিত আচরণ করতে পারে তবে গল্ফ করার পক্ষে দুর্দান্ত।
<>^v
চক্রাকারে একটি সারি বা কলাম বা গ্রিড পরিবর্তন করে এমনটি ব্যবহার করে উত্স কোড (এবং অতএব গোলকধাঁটির বিন্যাস) পরিবর্তন করা যেতে পারে ।
"
কোন বিকল্প নেই।
এখানে আমরা যাই।
কোডটি শুরু হয় <
, যা লিনিয়ার কোডটির দীর্ঘ অংশের সাথে শুরু করার সময় আমি কয়েকবার ব্যবহার করেছি olf এটি প্রথম সারির উপরের আইপি দিয়ে বক্ররেখরে চক্রাকারে স্থানান্তরিত করে , সুতরাং উত্সটি এর পরে দেখায়:
<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
তবে এখন আইপি কোথাও স্থানান্তর করতে পারে না, তাই এটি <
আবার কার্যকর করে। আমরা এই অবস্থায় পৌঁছা পর্যন্ত এটি অব্যাহত থাকে:
<
,,}:?
.
;(" {(={}{".
,",;=};} }) "{@
এই মুহুর্তে, আইপি সেলটি ছেড়ে দিতে পারে এবং দ্বিতীয় লাইনটি সম্পাদন শুরু করতে পারে ?
। সুতরাং এখানে রৈখিক কোডটি ভেঙে দেওয়া হয়েছে:
? # Read the first integer on STDIN, i.e. N.
:} # Duplicate it and move one copy over to the auxiliary stack.
, # Read the separator character.
,. # Read the first character of the input string and directly print it.
আইপি এখন এই 3x2 ঘরে প্রবেশ করেছে, যা আসলে দুটি শক্তভাবে সংকুচিত (ওভারল্যাপিং) 2x2 ঘড়ির কাঁটার লুপ। প্রথম লুপটি N-1
STDIN এর অক্ষরগুলি পড়ে এবং তা বাতিল করে দেয় ।
; # Discard the top of the stack. On the first iteration, this is the
# separator we've already read. On subsequent iterations this will be
# one of the N-1 characters from the input string.
( # Decrement N. If this hits zero, we leave the loop, otherwise we continue.
, # Read the next character from STDIN to be discarded.
এখন আমরা দ্বিতীয় লুপটি প্রবেশ করি যা ইনপুট স্ট্রিংয়ের বাকী অংশটি পড়ে। আমরা ইওএফ সনাক্ত করতে পারি কারণ আইপি বামদিকে পরিণত করে সেই ক্ষেত্রে ,
ফিরে আসবে -1
।
, # Read a character. Exit the loop if EOF.
( # Decrement it.
এই হ্রাসটি আসলে কার্যকর নয়, তবে আমরা এটি পরে বিনামূল্যে পূর্বাবস্থায় ফিরিয়ে আনতে পারি এবং এখানে এটি দুটি লুপকে ওভারল্যাপ করার অনুমতি দেয়।
যদি আমরা 5 ABCDEFGHIJKLMNOP
উদাহরণ হিসাবে ইনপুটটি নিই তবে স্ট্যাকটি দেখতে এমন দেখাচ্ছে:
Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' -1 | 5 ... ] Auxiliary
নোট করুন যে এগুলি আসলে ইনপুট অক্ষরের সাথে সামঞ্জস্য করে FGHIJKLMNOP
(কারণ আমরা সেগুলি হ্রাস করেছি), এবং আমরা আসলে এর মধ্যে প্রথমটি মুদ্রণ করতে চাই না (আমরা কেবল N-1
অক্ষরগুলি ফেলে রেখেছি, তবে এড়িয়ে যেতে চাই N
)।
এখন একটি ছোট লিনিয়ার বিট রয়েছে যা পরবর্তী লুপের জন্য স্ট্যাক প্রস্তুত করে:
; # Discard the -1.
= # Swap the tops of the stacks, i.e. N with the last character.
# By putting the last character on the auxiliary stack, we ensure that
# it doesn't get discarded in the next loop.
} # Move N over to the auxiliary stack as well.
স্ট্যাকগুলি এখন দেখতে দেখতে:
Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' | 5 'O' ... ] Auxiliary
আমরা অন্য 2x2 ঘড়ির কাঁটার লুপটি প্রবেশ করি। এটি N
প্রধান স্ট্যাক থেকে শীর্ষ বর্ণগুলি বাদ দেয় :
; # Discard the top of the main stack.
{ # Pull N over from the auxiliary stack.
( # Decrement it. It it's 0 we leave the loop.
} # Push N back to the auxiliary stack.
যখন আমরা লুপটি প্রস্থান করি তখন =
সেটি 0
এবং ইনপুট স্ট্রিংয়ের শেষ অক্ষরটি আবার বদল হয়। এখন স্ট্যাকগুলি দেখতে দেখতে:
Main [ ... 'E' 'F' 'G' 'H' 'I' 'O' | ... ] Auxiliary
বাম দিক থেকে আমরা মূল স্ট্যাকের বিষয়বস্তুগুলি (নীচের উপাদানটি বাদ দিয়ে এবং সমস্ত 1 দ্বারা বর্ধিত) মুদ্রণ করতে চাই । এর অর্থ আমাদের এটি সহায়ক সহায়তায় সরিয়ে নেওয়া দরকার। এটি পরবর্তী 2x2 (ঘড়ির কাঁটার দিকের) লুপটি করে:
{ # Pull an element over from the auxiliary stack. This is necessary so we
# have a 0 on top of the stack when entering the loop, to prevent the IP
# from turning right immediately.
} # Move the top of the main stack back to the auxiliary stack. If this was the
# bottom of the stack, exit the loop.
) # Increment the current character.
} # Move it over to the auxiliary stack.
স্ট্যাকস এখন:
Main [ ... | 'F' 'G' 'H' 'I' 'J' 'P] ... ] Auxiliary
আমরা তাদের মধ্যে প্রথমটি (যা আমরা মুদ্রণ করতে চাই না) তার সাথে মূল স্ট্যাকটিতে ফিরে যাই {
। এবং এখন আমরা চূড়ান্ত 2x2 ( ঘড়ির কাঁটার বিপরীতে ) লুপ প্রবেশ করি , যা বাকী অংশগুলি মুদ্রণ করে:
{ # Pull another character over from the auxiliary stack. Exit the loop
# if that's the zero at the bottom of the stack.
. # Print the character.
অবশেষে আমরা সাথে প্রোগ্রামটি শেষ করি @
।
'
গণনা চরিত্রের মতো কিছু দিয়ে এনকে একা করে নেওয়া কি ঠিক হবে ? উদাহরণস্বরূপ:''123321
?