BrainF ** কে, 396 391 বাইট
>+>>++++[-<++++++++>]->,----------[++++++++++.>>++++++++[-<++++<------>>]<.,----------]-<+[-<+]->>+[-<<<<<++++++++++.[-]>[-<+>>.<]<[->+<]>+>>>[[->+]->>+<<<+[-<+]->]>+[-<->[[->+]->+>>+<<<<+[-<+]->]<+>->+[->+]->>[->+<]>+>++++++++++>>-<<[-<-[>>]<]<->>>+[-<<<+>>>[-<->]<+++++++++>>>+]++++++++[-<++++<++++++>>]<<<[-<<<<+[-<+]-<+>>+[->+]->>>>+<]>.>.[-]<[-]<<<[->+<]<<+[-<+]>+]>>[-]<<<-<+[-<+]->>+]
আমি এটি করার প্রলোভনকে প্রতিহত করতে পারি না। কমপক্ষে ত্রিভুজটি নীচু দিকের নীচে।
ইনপুটটি একক নিউলাইন অনুসারে সংখ্যাসূচক অক্ষরের একটি স্ট্রিং হিসাবে আসে।
আউটপুট প্রতিটি লাইনে একক চলমান স্থান থাকবে।
উদাহরণ:
$ bf sd.bf
010
0 1 0
1 1
2
$ bf sd.bf
123456
1 2 3 4 5 6
3 5 7 9 1
8 2 6 0
0 8 6
8 4
2
$ bf sd.bf
9245322
9 2 4 5 3 2 2
1 6 9 8 5 4
7 5 7 3 9
2 2 0 2
4 2 2
6 4
0
ব্যাখ্যা
যেহেতু কোডটি কার্যকরী দৃষ্টিকোণ থেকে ব্যাখ্যা করা বরং কঠিন, তাই আমরা পরিবর্তে এটি বিভিন্ন সময় টেপের অবস্থার দৃষ্টিকোণ থেকে দেখতে পারি। এখানে মূল ধারণাটি হ'ল আমাদের আউটপুট ত্রিভুজটি শক্তভাবে প্যাকযুক্ত (বিএফের জন্য, যাইহোক) অ্যারে হিসাবে সূচনা করা হয় যা লুপের প্রতিটি পুনরাবৃত্তিতে 1 দ্বারা আকারে সঙ্কুচিত হয়। আরেকটি গুরুত্বপূর্ণ চিন্তাভাবনা হ'ল আমরা 255
কোনও "স্থানধারক" নির্দেশ করতে ব্যবহার করি যা আমরা টেপটিতে সন্ধান করতে পারি।
আরম্ভ
এটি সবচেয়ে সহজ পদক্ষেপ। প্রোগ্রামটির শুরুতে, আমরা নিম্নলিখিতগুলি সম্পাদন করি:
>+>>++++[-<++++++++>]->
এটি টেপটিকে নিম্নলিখিত অবস্থায় জোর করে (যেখানে >N<
টেপের উপরের পয়েন্টারের অবস্থান নির্দেশ করে)
[ 0 1 32 255 >0< 0 0 ...]
এখানে প্রথম সংখ্যাটি একটি "বাফার" অবস্থান। আমরা এটি দীর্ঘমেয়াদী ভিত্তিতে ব্যবহার করতে যাচ্ছি না, তবে সামান্য ক্রিয়াকলাপকে আরও সহজ করার জন্য এবং চারপাশের ডেটা অনুলিপি করার জন্য এটি দরকারী।
দ্বিতীয় সংখ্যাটি হ'ল স্পেসের সংখ্যা যা আমরা প্রতিটি লাইনের শুরুতে প্রথম লাইনের পরে শুরু করে আউটপুট করব । প্রথম লাইনে কোনও শীর্ষস্থানীয় স্থান নেই।
তৃতীয় নম্বরটি আমরা আউটপুট আউট স্পেস অক্ষর।
চতুর্থ সংখ্যাটি একজন স্থানধারক 255, যাতে আমরা তুলনামূলকভাবে সহজেই এই অবস্থানে ফিরে যেতে পারি can
ইনপুট
এই অবস্থান থেকে, আমরা সমস্ত অক্ষর পড়ব। এই পদক্ষেপের শেষে আমরা আশা করি নিম্নলিখিত পরিস্থিতিতে থাকব:
[ 0 1 32 255 a b c d e f ... >255< 0 0 ... ]
যেখানে a b c d e f ...
সংখ্যার অক্ষরের স্ট্রিংটি নির্দেশ করে যা ইনপুট ছিল (নতুন লাইন নয়)।
আমরা নিম্নলিখিত সহ এটি সম্পন্ন:
,----------[++++++++++.>>++++++++[-<++++<------>>]<.,----------]-
এটির কিছু সংক্ষিপ্তসার রয়েছে। প্রথমত, আমরা প্রতিটি চরিত্রকে পাওয়ার সাথে সাথে আউটপুট দেব এবং তারপরে একটি স্থান আউটপুট করব। দ্বিতীয়ত, আমরা টেপটিতে ASCII মানটি অনুলিপি করতে চাই না, আমরা আসল সংখ্যার অঙ্কটি অনুলিপি করতে চাই। তৃতীয়ত, আমরা যখন একটি নতুন লাইনটি হিট করি এবং তখন নিজেকে একটি ভাল জায়গায় রেখে যাই আমরা থামতে চাই।
আমাদের ইনপুট বলুন 6723
। তারপরে, প্রথমটি পড়ার পরে, 6
আমাদের টেপটি এমন দেখাচ্ছে:
[ 0 1 32 255 >54< 0 0 ...]
আমরা পরীক্ষা করে দেখি যে এই মানটি 10
(একটি ASCII নিউলাইন) এর সাথে সমান নয় ,----------[++++++++++
। তারপরে আমরা মানটি মুদ্রণ করি এবং একই সাথে ইনপুট মান থেকে 48 বিয়োগ করে এবং এর পাশের মানটিতে 32 যোগ করে (আমাদের >>++++++++[-<++++<------>>]<
) এখানে রেখে চলেছি:
[ 0 1 32 255 6 >32< 0 ...]
লক্ষ্য করুন কিভাবে এই প্রক্রিয়া চলাকালীন আমরা অনুমান করতে পারেন যে, আমাদের ইনপুট ডানদিকে ভাবে সংখ্যা বসিয়ে 0 রয়েছে - এর মানে হল যে আমরা কোনো পূর্বের অবস্থায় বিনষ্টকারী বিপদের মধ্যে না থাকেন, আমরা গণনা করতে ডানদিকে মান ব্যবহার 6 * 8
এবং 4 * 8
।
এখন আমরা কেবলমাত্র উত্পন্ন স্থানের অক্ষর আউটপুট করি এবং একটি নতুন ইনপুট গ্রহণ করি, সেখানে গণনা করা স্থান মুছে ফেলা। অবশেষে, ইনপুটটি একটি নতুন লাইন দ্বারা বন্ধ হয়ে যাবে এবং লুপটি প্রস্থান করবে, 255
যেখানে নতুন লাইনটি থাকত ( ,----------]-
)। এটি দ্বিতীয় স্থানধারক চরিত্রটি আমরা টেপ নেভিগেট করতে ব্যবহার করব। আমাদের দৃশ্যের এই মুহুর্তে, আমাদের টেপটি হ'ল:
[ 0 1 32 255 6 7 2 3 >255< 0 0 ... ]
হিসাব
যেভাবে এটি কাজ করে তা হ'ল আমাদের 255
স্থানধারকগুলির মধ্যে অঙ্কগুলির তালিকাটি লুপের প্রতিটি পুনরাবৃত্তির দ্বারা সঙ্কুচিত হতে চলেছে। যখন এটিতে কেবল 1 ডিজিট বাকী রয়েছে, আমরা শেষ করেছি এবং তাত্ক্ষণিকভাবে থামতে হবে (দ্রষ্টব্য, এই মুহুর্তে, তালিকার প্রতিটি অঙ্ক ইতিমধ্যে আউটপুট হয়ে গেছে, সুতরাং আমাদের এটি আবার আউটপুট দেওয়ার বিষয়ে চিন্তা করতে হবে না)।
আমরা এখন প্রথম নেভিগেট করতে এই কৌতুক ব্যবহার 255
স্থানধারক: <+[-<+]-
। এটি কার্যকরভাবে একটিটির জন্য বাম দিকে টেপটি অনুসন্ধান করে 255
, এর মধ্যে কোনও কিছুই পরিবর্তন করে না। এখন যেহেতু আমরা পয়েন্টারটি সরিয়ে নিয়েছি, আমরা আমাদের প্রস্থান শর্তটি পরীক্ষা করতে পারি: তালিকায় যদি কেবল একটি অঙ্ক থাকে তবে ডানদিকে ঘর দুটি ফাঁকা স্থান ধরে রাখবে 255
। সুতরাং, আমরা এটির বিরুদ্ধে পরীক্ষা করে একটি লুপ শুরু করি:>>+[-<<
আমাদের লুপের প্রথম ধাপটি একটি নতুন লাইন আউটপুট। সুতরাং আমরা প্রথম ঘরে (আমাদের বাফার সেল) সরে যাই, এটিতে 10 যোগ করে আউটপুট দেয়। পরবর্তী পদক্ষেপটি সমস্ত নেতৃস্থানীয় স্থানের অক্ষর আউটপুট করা। সেগুলি আউটপুট দেওয়ার পরে, আমরা নেতৃস্থানীয় স্পেসগুলির সংখ্যার জন্য আমাদের গণনা বৃদ্ধি করি। এই পদক্ষেপগুলি নিম্নলিখিত দ্বারা সম্পাদিত হয়:
-<<<<<++++++++++.[-]>[-<+>>.<]<[->+<]>+>>>
যা আমাদের এই অবস্থায় ফেলে দেয়:
[ 0 2 32 255 >6< 7 2 3 255 0 0 0 0 0 0 ]
আমাদের পরবর্তী পদক্ষেপটি তালিকার প্রথম স্থানটি অনুলিপি করে, দ্বিতীয় স্থানধারককে ছাড়িয়ে গেছে 255
:
[[->+]->>+<<<+[-<+]->]
আমরা মূলত আমাদের স্থানধারকগুলির মধ্যে পিছনে পিছনে হাঁপিয়ে 255
আমাদের এখানে রেখে:
[ 0 2 32 255 >0< 7 2 3 255 0 6 0 0 ... ]
আমরা এখন একটি লুপ শুরু করি, বাকী তালিকার মধ্য দিয়ে পুনরাবৃত্তি করে, আঘাত করলে থামি 255
:>+[-<
এই মুহুর্তে, আমাদের তাত্ক্ষণিক বাম দিকে সংখ্যাটি সর্বদা 0 থাকে So সুতরাং, কারণ আমরা তাদের ভালবাসি, আমরা 255
সেখানে একটি স্থানধারককে পপ করব যাতে তালিকায় আমাদের জায়গায় ফিরে আসতে পারি। পরের পদক্ষেপটি তালিকার দ্বিতীয় স্থানটি আশেপাশের লোকেশনগুলিতে স্থানান্তর করা যেখানে আমরা প্রথম স্থানধারককে পেরিয়ে প্রথম স্থানটিতে চলে এসেছি 255
। এই পদক্ষেপগুলি নিম্নলিখিত দ্বারা সম্পাদিত হয়:
->
[[->+]->+>>+<<<<+[-<+]->]
আমাদের এখানে রেখে চলেছেন : [ 0 2 32 255 255 >0< 2 3 255 7 6 7 0 ]
এখন, উভয়ই 6
এবং 7
এমন একটি জায়গায় চলে গেছে যেখানে গণনা হতে পারে occur আমাদের দুটি কপি দরকার 7
কারণ তালিকার পরবর্তী নম্বরটিও এটির প্রয়োজন হবে। 7
অবিলম্বে পরে 255
এই উদ্দেশ্যে কাজ করে, যেহেতু অন্যান্য 7
হিসাব খায় করা হবে না।
প্রথমে আমরা দুটি অঙ্ক যুক্ত করব:
<+>->+[->+]->>
[->+<]>
আমাদের এখানে রেখে:
[ 0 2 32 255 0 255 2 3 255 7 0 >13< 0 ]
পদক্ষেপের পরবর্তী সংমিশ্রণটি সবচেয়ে জটিল। আমাদের দেখতে হবে যে সংখ্যাটি আমরা নির্দেশ করছি সেটি 10 এর চেয়ে বড় কিনা এবং যদি এটি হয় তবে আমরা বিয়োগ করি 10
। বাস্তবে, আমরা যা করি তা হ'ল আমরা তা থেকে 10 বিয়োগ করে দেখি যে এটি 0
বিয়োগের কোনও বিন্দুতে আঘাত করে কিনা । যদি এটি হয় তবে আমরা 10
পরে আবার যুক্ত করব। এর শেষে, আমাদের যোগফল 10 হওয়া উচিত।
Prepare a 10 to the right
+>++++++++++
Leave yet another 255 for a loop condition later
>>-<<
If the number is greater than 10 end up one space to the left
else one space to the right
[-<-[>>]<]<->
Check if the previous 255 is two spaces to the right and if it is
add 10 back to our sum--we've subtracted too much
>>+[-<<<+>>>[-<->]<+++++++++>>>+]
এই মুহুর্তে, আমরা লক্ষ্যটি অর্জন করেছি। আমাদের যোগফল 10 আছে! এছাড়াও, সংখ্যাটি 10 এর চেয়ে বেশি ছিল কি না, আমরা এখানেই শেষ করব:
[ 0 2 32 255 0 255 2 3 255 7 0 3 0 0 >0< ]
আমাদের পরবর্তী লক্ষ্যগুলি হল এই নতুন অঙ্কটি আউটপুট করা, একটি স্থানের সাথে এটি অনুসরণ করা এবং এটি আবার আমাদের তালিকায় ইনজেক্ট করা। আমরা আমাদের পূর্ববর্তী কৌশলগুলি - 255
শপিং এবং 48
আমাদের যোগে যুক্ত করার মাধ্যমে এটি করি, তাই আমি এটিকে বিস্তারিতভাবে কভার করব না।
++++++++[-<++++<++++++>>]
<<<[-<<<<+[-<+]-<+>>+[->+]->>>>+<]
>.>.
এবং আমরা এখানে আছি: [ 0 2 32 255 3 255 2 3 255 7 0 0 51 >32< ]
লক্ষ্য করুন কীভাবে আমরা 255
আমাদের নতুন ইনজেকশনের পরে একটি অতিরিক্ত স্থানধারক রেখেছি 3
যাতে তালিকায় স্থানটি হারাতে না পারি। এই মুহুর্তে, আমাদের আউটপুটটি আমাদের যোগফল এবং তার স্থান রয়েছে, তাই আমাদের পরিষ্কার করে এমন অবস্থায় ফিরে যেতে হবে যেখানে এই লুপের পরবর্তী পুনরাবৃত্তি কাজ করবে। আমাদের আমাদের 51
এবং 32
কোষগুলি পরিষ্কার করতে হবে, 7
একবারে ডান দিকে সরানো এবং আমাদের তালিকা প্লেসোল্ডারের কাছে নেভিগেট করতে হবে যাতে আমরা শুরু করতে পারি।
[-]<[-]<<<[->+<]<<+[-<+]
এখন, আমরা এখানে আছি: [ 0 2 32 255 3 >0< 2 3 255 0 7 0 ... ]
আমাদের পরবর্তী পুনরাবৃত্তির জন্য আমরা ঠিক যেখানে থাকতে চাই। 255 জন্য পরীক্ষা করুন এবং এগিয়ে যান! ( >+]
)
যখন আমরা লুপটি থেকে নামিয়ে ফেলি, আমরা একটি সম্পূর্ণ নতুন তালিকা রাখতে যাচ্ছি - পূর্ববর্তী তালিকা থেকে যোগগুলি তৈরি করে। প্রথমবারের মতো, এটির মতো দেখতে:
[ 0 2 32 255 3 9 5 0 >0< ]
এখন আমরা আমাদের নতুন তালিকায় সেই পুরো প্রক্রিয়াটি পুনরাবৃত্তি করতে চাই, তাই আমরা 255
নীচে বাম দিকে নেমে সমস্ত কিছু শুরু করব! আমাদের সাথে কিছুটা সাফাই করা দরকার >>[-]<<
, এবং তারপরে আমাদের স্থানধারককে বাদ দিয়ে দিন <-
। তারপরে, আমরা ইনপুট দেওয়ার পরে ঠিক ঠিক একই জায়গায় এসেছি, যাতে আমরা একই চেকগুলি করে পালিয়ে যেতে পারি: <+[-<+]->>+
এবং গুম্ফ! আমরা আমাদের সম্পূর্ণ লুপ পেয়েছি! আমাদের যা দরকার বন্ধ বন্ধনী, এবং যখন এটা শেষ আমরা তাই আমরা কাজ সম্পন্ন হয় ইতিমধ্যে আউটপুট সবকিছু করেছি: ]
।