1. বেসিক
ব্রেইনফাক বুঝতে আপনার অবশ্যই 0
প্রতিটি দ্বারা সূচিত কক্ষের অসীম অ্যারে কল্পনা করতে হবে ।
...[0][0][0][0][0]...
যখন ব্রেনফাক প্রোগ্রাম শুরু হয়, এটি যে কোনও ঘরে নির্দেশ করে।
...[0][0][*0*][0][0]...
আপনি যদি পয়েন্টারটি ডানদিকে নিয়ে যান তবে আপনি >
সেল এক্স থেকে সেল এক্স + 1 এ পয়েন্টারটি সরাচ্ছেন
...[0][0][0][*0*][0]...
আপনি যদি সেল মান বাড়ান তবে +
আপনি পাবেন:
...[0][0][0][*1*][0]...
যদি আপনি আবার সেল মান বাড়ান তবে আপনি +
পাবেন:
...[0][0][0][*2*][0]...
আপনি যদি কক্ষের মূল্য হ্রাস করেন তবে -
পাবেন:
...[0][0][0][*1*][0]...
আপনি যদি পয়েন্টার বামে সরান তবে আপনি <
সেল এক্স থেকে সেল এক্স -1 এ পয়েন্টারটি সরাচ্ছেন
...[0][0][*0*][1][0]...
2. ইনপুট
চরিত্রটি পড়তে আপনি কমা ব্যবহার করেন ,
। এটি কী করে: স্ট্যান্ডার্ড ইনপুট থেকে অক্ষরটি পড়ুন এবং এর দশমিক ASCII কোডটি প্রকৃত ঘরে লিখুন।
এএসসিআইআই টেবিলটি একবার দেখুন । উদাহরণস্বরূপ, এর দশমিক কোড !
হল 33
, যখন a
রয়েছে 97
।
ঠিক আছে, আপনার বিএফ প্রোগ্রামের মেমরিটি দেখে মনে হচ্ছে:
...[0][0][*0*][0][0]...
ধরে নিই, স্ট্যান্ডার্ড ইনপুটটি হ'ল, a
আপনি যদি কমা ,
অপারেটর ব্যবহার করেন , বিএফ যা করে তা a
ডেসিম্যাল এএসসিআইআই কোডটি 97
মেমোরিতে পড়ে:
...[0][0][*97*][0][0]...
আপনি সাধারণত সেভাবে ভাবতে চান তবে সত্যটি কিছুটা জটিল। সত্যটি হ'ল বিএফ একটি চরিত্র পড়েনি তবে একটি বাইট (যা বাইট যাই হোক না কেন)। আমি আপনাকে উদাহরণ দেখাতে দিন:
লিনাক্সে
$ printf ł
কপি করে প্রিন্ট:
ł
যা নির্দিষ্ট পোলিশ চরিত্র। এই অক্ষরটি ASCII এনকোডিং দ্বারা এনকোড করা হয়নি। এই ক্ষেত্রে এটি ইউটিএফ -8 এনকোডিং, তাই এটি কম্পিউটারের মেমোরিতে একাধিক বাইট গ্রহণ করত। আমরা একটি হেক্সাডেসিমাল ডাম্প তৈরি করে এটি প্রমাণ করতে পারি:
$ printf ł | hd
কোন প্রদর্শনী:
00000000 c5 82 |..|
জিরোস অফসেট হয়। 82
প্রথম এবং c5
দ্বিতীয় বাইট প্রতিনিধিত্ব করে ł
(ক্রমে আমরা সেগুলি পড়ব)।|..|
গ্রাফিকাল উপস্থাপনা যা এই ক্ষেত্রে সম্ভব নয়।
ঠিক আছে, আপনি যদি ł
আপনার বিএফ প্রোগ্রামটিতে ইনপুট হিসাবে পাস করেন যা একক বাইট পড়ে, প্রোগ্রাম মেমোরিটি দেখতে পাবেন:
...[0][0][*197*][0][0]...
কেন 197
? ঠিক 197
দশমিক c5
হেক্সাডেসিমাল। পরিচিত মনে হচ্ছে? অবশ্যই. এটি প্রথম বাইটł
!
3. আউটপুট
চরিত্রটি মুদ্রণের জন্য আপনি বিন্দুটি .
যা ব্যবহার করে তা ব্যবহার করুন : ধরে নিই আমরা দশমিক ASCII কোডের মতো প্রকৃত ঘর মানটিকে মান্য করি, মানক আউটপুটের সাথে সম্পর্কিত অক্ষর মুদ্রণ করি।
ঠিক আছে, আপনার বিএফ প্রোগ্রামের মেমরিটি দেখে মনে হচ্ছে:
...[0][0][*97*][0][0]...
আপনি যদি এখনই ডট (।) অপারেটর ব্যবহার করেন, বিএফ যা করে তা মুদ্রণযোগ্য:
একটি
কারণ a
এএসসিআইআই-এর দশমিক কোড97
।
সুতরাং উদাহরণস্বরূপ বিএফ প্রোগ্রামের জন্য (97 টি বিস্ফোরণে 2 বিন্দু):
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++ ..
ঘরের মূল্য এটি 97 পর্যন্ত বাড়িয়ে তুলবে এবং এটি 2 বার মুদ্রণ করবে।
এএ
4. লুপস
বিএফ লুপে লুপ শুরু [
এবং লুপ শেষ থাকে ]
। আপনি যখন সি / সি ++ তে থাকতে পারেন তখন অবস্থাটি প্রকৃত সেল মান হিসাবে ভাবতে পারে।
নীচে দেখুন বিএফ প্রোগ্রাম:
++[]
++
প্রকৃত ঘর মান দ্বিগুণ বৃদ্ধি করে:
...[0][0][*2*][0][0]...
এবং []
এর মতো while(2) {}
, তাই এটি অসীম লুপ।
ধরা যাক আমরা এই লুপটি অসীম হতে চাই না। আমরা উদাহরণস্বরূপ করতে পারি:
++[-]
সুতরাং প্রতিবার একটি লুপ লুপ করে এটি প্রকৃত ঘরের মান হ্রাস করে। একবার প্রকৃত ঘর মান 0
লুপ শেষ হয়ে গেলে :
...[0][0][*2*][0][0]... loop starts
...[0][0][*1*][0][0]... after first iteration
...[0][0][*0*][0][0]... after second iteration (loop ends)
সীমাবদ্ধ লুপের আরও একটি উদাহরণ বিবেচনা করা যাক:
++[>]
এই উদাহরণটি দেখায়, আমাদের যে ঘরে লুপটি শুরু হয়েছিল সেটিতে লুপ শেষ করতে হবে না:
...[0][0][*2*][0][0]... loop starts
...[0][0][2][*0*][0]... after first iteration (loop ends)
তবে আমরা যেখানে শুরু করেছি সেখানেই শেষ করা ভাল অনুশীলন। কেন? কারণ লুপ যদি অন্য কক্ষটি শুরু করে তবে এটি সেল পয়েন্টারটি কোথায় হবে তা আমরা ধরে নিতে পারি না। সত্যি কথা বলতে কী, এই অনুশীলনটি ব্রেনফাককে ব্রেনফাক কম করে।