Bangla-brainfuck-tutorial

Simple tutorial on Brainfuck language in Bangla

About me


ব্রেইনফাক প্রোগ্রামিং ল্যাঙ্গুয়েজ টিউটোরিয়াল

ব্রেইনফাক প্রোগ্রামিং ল্যাঙ্গুয়েজ এর সাথে পরিচয় বেশি দিন আগে থেকে নয়। SPOJ এ প্রোগ্রামিং প্র্যাকটিস করতে গিয়ে এই সুন্দর ল্যাঙ্গুয়েজ সম্পর্কে জানতে পারি। এখন আমি এই ল্যাঙ্গুয়েজ সম্পর্কে তোমাদের একটু ধারণা দিতে চাই।
ব্রেইনফাক প্রোগ্রামিং ল্যাঙ্গুয়েজের জন্ম ১৯৯৩ সালে এবং এর আবিষ্কারক হলেন Urban Müller(আরবান মুলার)। এই ল্যাঙ্গুয়েজ এর সবচেয়ে মজার দিক হল এর কম্পাইলার এর সাইজ! ব্রেইনফাক কম্পাইলার এর সাইজ আধা কিলোবাইট এর থেকেও কম!! আর একটি ব্যাপার হল এই ল্যাঙ্গুয়েজ এ মাত্র আটটি কমান্ড রয়েছে! তাই এটি শেখা খুবই সহজ। যারা C,C++ ইত্যাদি ল্যাঙ্গুয়েজ জানো তাদেরতো মজার শেষ নেই, ব্রেইনফাক ল্যাঙ্গুয়েজটা তোমাদের জন্য একটা pointer নিয়ে খেলা করার মতই বিষয়! এবার চল ব্রেইনফাক ল্যাঙ্গুয়েজ নিয়ে খেলাধুলা শুরু করা যাক।

বেসিক আইডিয়াঃ

ব্রেইনফাক এর কমান্ড গুলো হলঃ

> < [ ] , . + -

ব্রেইনফাক ল্যাঙ্গুয়েজটা আসলে তোমাকে একটা 30000 byte সাইজ এর array দিয়ে থাকে কম্পাইলার অথবা ইন্টারপ্রেটার ভেদে এই সাইজ কম বেশী হতে পারে। কিন্তু, standard ব্রেইনফাক কম্পাইলার ৩০০০০ বাইট সাইজ এর array এর ব্যবস্থা করে থাকে।

উপরে দেওয়া আটটি কমান্ড এর মাধ্যমে তুমি এই array টাকে যেমন ইচ্ছা manipulate করতে পারবে। এই চিহ্নগুলয়র আসল কেরামতি নিচে দেওয়া হলঃ
> = পয়েন্টার এক ব্লক সামনে নিয়ে যাবে
< = পয়েন্টার এক ব্লক পিছনে নিবে
[ = একটা লুপ শুরু করবে যা ততক্ষণ চলবে যতক্ষণ না ঐ ব্লকের মান শুন্য না হয়
] = যদি বর্তমান ব্লকের মান শুন্য না হয় তাহলে পুনরায় [ এই স্থানে ফিরে যাও
, = কনসোলের থেকে একটা ইনপুট নাও
. = কনসোলে বর্তমান পয়েন্টার এর সমতুল্য ভেল্যুর ASCII chars প্রিন্ট কর

কিছু কাহিনীঃ

1.ব্রেইনফাক ল্যাঙ্গুয়েজ এর ক্ষেত্রে, শুধু মাত্র এই আটটি কম্যান্ডই প্রযোজ্য। এ ছাড়া বাকি সব কিছুই comment হিসেবে বিবেচনা করা হয়।
2. ব্রেইনফাক এর array এর প্রতিটি ব্লক এর মান শুরুতে 0 থাকে।
3. বিভিন্ন ল্যাঙ্গুয়েজ এর নেস্টেড লুপ কনসেপ্ট ব্রেইনফাক এর ক্ষেত্রে ও একই রকম কাজ এ দেয়। এখানেও চাইলে একাধিক নেস্টেড লুপ ব্যবহার করতে পারবে।

অনেক কাহিনী বললাম। এবার চল একটা প্রোগ্রাম করা যাক!

[-]

তোমার জীবনের প্রথম ব্রেইনফাক প্রোগ্রাম !! যদিও এইটা তেমন মজার কিছু না জাস্ট একটা লুপ যা শুধু ব্লকের মান কমাতে থাকে যতক্ষণ না মান ০ হয়। কিন্তু, মজার ব্যাপার হল এখানে লুপটি রান ই হবে না! কারণ?
কারণ, আমরা শুরুতেই বলেছি, ব্রেইনফাকের array এর মান শুরুতে শুন্য থাকে তাই লুপ এর কন্ডিশন false তাহলে চল কন্ডিশন ট্রু করে দেখি কি হয় আরেকটা প্রোগ্রাম দেখা যাক

+++[-]

দেখ কি সুন্দর! আমরা প্রথম ব্লকের মান ৩ করে দিলাম । এইবার কন্ডিশন ট্রু তাই লুপ এ ঢুকবে , এবং লুপের মাধ্যমে আমরা প্রতি বার এক এক করে বিয়োগ করতে লাগলাম যতক্ষণ না শুন্য হয় তো এবার বল তো লুপটা কয়বার চলবে?
ঠিক বলেছ! মাত্র তিন বার

হুম, দেখলে কিন্তু মজা পেলে না?
ঠিক আছে আরো মজার উদাহরণ দেখি চল

>+++++++++
[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]
>++++++++[<++++>-] <.>+++++++++++[<++++++++>-]<-.--------.+++
.------.--------.[-]>++++++++[<++++>- ]<+.[-]++++++++++.

ওরে বাপরে! এইসব কি? আসলে দোষের কিছু নাই কোডের স্টাইল দেখে ভয় পাওয়া স্বাভাবিক একটু খেয়াল কর দেখ ব্যাপারটা কতই সহজ

>+++++++++

এইখানে আমরা জানি > মেমরি পয়েন্টার এক ঘর সামনে নেয় তারপর ভেল্যু যোগ করে আমরা পাই ৯
দেখ
[০][৯]
[<++++++++>-]<.

[ এইটা দেখেই বুঝে গেলা লুপ, কিন্তু লুপ এর কন্ডিশন কি? আমরা কিছুক্ষণ আগেই দেখলাম ওই পয়েন্টার পজিশনের মান নয় (৯) তাই লুপ চলবে ।
< এইটার মাধ্যমে আমরা বুঝে গেলাম পয়েন্টার আবার এক ব্লক পিছনে নেয়া হল তাহলে আমরা এখন ঠিক প্রথম ব্লকে আসলাম ।
এবং ++++++++ এর সাহায্যে এই ব্লকের মানের সাথে আট (৮) যোগ করলাম
> এইটার সাহায্যে আগের মত পয়েন্টার এক ব্লক সামনে অর্থাৎ আবার ৯ কে পয়েন্ট করলাম। এবং - তাই ব্লকের মান এক কমালাম তাই এর মান এখন হবে ৮। অনেকটা এই রকম [৮][৯] ==> [৮][৮]
এইবার ] শুরুতেই বলেছি এইটা বর্তমান মেমরি ব্লকের মান চেক করবে যদি ০ হয় তাহলে পরবর্তী কমান্ডে যাবে না হয় পুনরায় [ এই পজিশনে চলে যাবে এবং আবার একই ভাবে লুপ চলবে।
সুতরাং আবার পয়েন্টার সামনের ব্লককে পয়েন্ট করবে এবং ৮ যোগ করবে। তারপর, আবার ২য় ব্লকে আসবে এবং এক বিয়োগ করবে। এখন যদি আমরা array টাকে দেখি দেখব [১৬][৭] এই লুপটা শেষ হবে যখন দ্বিতীয় ব্লকের মান শুন্য হয়।শেষে পয়েন্টার ১ম ব্লককে পয়েন্ট করবে। এখন, বল প্রথম ব্লকের মান কত হবে?
হুম, আমরা প্রতি লুপে প্রথম ব্লকের মান ৮ করে বাড়িয়েছি এবং লুপটা ৯ বার চলেছে, সুতরাং মান হবে ৮*৯=৭২
. আমরা আগেই বলেছি এই কমান্ডের মাধ্যমে বর্তমান ব্লকের মান stdout এ দেখায়, সোজা বাংলায় এই কমান্ডের মাধ্যমে আমরা প্রিন্ট করি। খেয়াল রাখতে হবে যে, আমরা কিন্তু ৭২ আউটপুট পাব না। আমরা দেখব, এর ascii ফরম্যাট। ৭২ হল 'H' এর মান তাই আমরা আউটপুটে 'H' দেখতে পাব

কি বুঝলা? ভাবছ একটা char প্রিন্ট করতে এত কাহিনী করা লাগে? আরে, এইটাই তো মজা। এইবার দেখি ঝটপট পুরো প্রোগ্রাম এর আউটপুট কি হবে বলত?
না! এই বার আমি বলব না এটা তুমি বের করবে।

ইনপুট/ আউটপুটঃ

আগেই বলেছি, ব্রেইনফাকে ইনপুট নেয়া হয় ',' এর মাধ্যমে। এখানে আসলে ইনপুট হিসেবে যা ই দেয়া হয় না কেন ব্রেইনফাক এটার ascii মান এর ডেসিমেল মানটি ওই মেমরী পজিশনে সংরক্ষণ করে রাখে। তো আমরা যদি '০' কে ইনপুট হিসেবে দিই তাহলে কিন্তু ওই মেমরী পজিশনের মান ০ হবে না! আসলে ওই পজিশনের মান হবে ৪৮।

,.

এই দুই বাইটের কোডটি একটি ইনপুট নিবে এবং এর সমমানের ascii char প্রিন্ট করবে।

চল আরেকটু মজাদার কোড দেখি,

>,[>,]<[<]>[.>]

দেখ, এটা UNIX cat কমান্ড এর ব্রেইনফাক সংস্করণ! এটা আসলে STDIN থেকে যা ই ইনপুট নিবে তা ই STDOUT এ আউটপুট দিবে।

চল কোডটার ব্যবচ্ছেদ করি
>,[>,]
হুম কি বুঝলা? আমরা দ্বিতীয় ব্লকে প্রথম ইনপুটটাকে সংরক্ষণ করলাম, প্রথম ব্লকের মান ০ থাকবে কিন্তু কেন এটা করলাম?
ধৈর্য ধর! আগে লুপে ঢুকি , এখানে আমরা প্রতিবার ব্লক পরিবর্তন করে প্রতি মেমরী ব্লক পজিশনে ascii মান এর ডেসিমেল মান সেইভ বা সংরক্ষণ করতে লাগলাম। তোমরা তো জানই যে, '\0' হল null char এর ascii মান হল 0
তাই এই লুপটির শেষ হবে যখন আমরা null char ইনপুট দিব অর্থাৎ আমরা ০ মানের ascii char ইনপুট দিব। এইবার দেখ ওই যে প্রথম ব্লক খালি রাখার মূল কারণ
<[<]
আমরা ইনপুট নেয়ার সময় শেষ ব্লকে ০ নিয়েছিলাম কিছুক্ষণ আগেই দেখেছ তাই ওইটাকে এড়িয়ে যাওয়ার জন্যই < এইটা ব্যবহার করলাম।
এখন আমরা নতুন একটা লুপ দেখতে পাচ্ছি যেটা আমাদের কে প্রথম মেমরী ব্লকে নিয়ে যাবে!
কারণ, এই ক্ষেত্রে প্রথম ব্লকের শুন্য মানটি এই লুপটিকে শেষ করতে ব্যবহৃত হবে ।
>[.>]
বাকি কোডটা খুবি সহজ, এটা প্রতি ব্লকের মানগুলো আউটপুট হিসেবে দিবে যতক্ষণ না সে null char এ পৌঁছে।

আর এটাই হল ব্রেইনফাক প্রোগ্রামিং এর বেসিক কাহিনী এই সবগুলো বুদ্ধি কাজে লাগিয়ে তুমি চাইলেই যেকোনো প্রোগ্রামিং সমস্যার সমাধান করতে পার।