Get the code: bf-fa.bf
برین فاک زبان برنامه نویسی تورینگ کامل بی نهایت ساده ایست که دارای فقط هشت
دستور است.
هر کارکتری به جر کارکتر های زیر در این زبان در نظر گرفته نمیشود.
>
<
+
-
.
,
[
]
برین فاک به صورت یک آرایه ی سی هزار خانه ای کار میکند که در ابتدا تمامی خانه های آن صفر هستند.
همچنین یک اشاره گر در این برنامه به خانه ی فعلی اشاره میکند.
در زیر هشت دستور این زبان شرح داده شده است:
`+` : یک عدد به خانه ی فعلی اضافه می کند.
`-` : یک عدد از خانه ی فعلی کم می کند.
`>` : اشاره گر به خانه ی بعدی میرود – به راست
`<` : اشاره گر به خانه ی قبلی میرود -- به چپ
`.` : کارکتر اسکی معادل مقدار خانه ی فعلی را چاپ میکند. – به عنوان مثال 65 برای A
`,` : یک کارکتر را از ورودی خوانده و مقدار آن را در خانه ی فعلی زخیره میکند.
`[` : اگر مقدار خانه ی فعلی صفر باشد به محل بسته شدن کروشه جهش میکند. – و از همه ی دستور های بین آن صرف نظر میشود.
در غیر این صورت به دستور بعدی میرود.
`]` : اگر مقدار خانه ی فعلی صفر باشد به خانه ی بعدی و در غیر این صورت به محل باز شدن کروشه جهش می کند. – به عقب
دو علامت کروشه امکان ایجاد حلقه را فراهم میکنند.
در اینجا یک برنامه ی ساره برین فاک را مشاهده میکنید.
++++++ [ > ++++++++++ < - ] > +++++ .
این برنامه کارکتر A را بر روی خروجی چاپ میکند.
در این برنامه خانه ی اول به عنوان متغیر حلقه و خانه ی دوم برای مقدار عددی A
ابتدا عدد شش در خانه ی اول ایجاد شده. سپس برنامه وارد یک حلقه میشود که در هر بار
تکرار آن اشاره گر به خانه ی دوم رفته و ده بار به خانه ی فعلی اضافه می کند.
– و در انتهای حلقه به خانه ی اول برگشته تا حلقه کنترل شود
بعد از اتمام حلقه به خانه ی دوم میرود و پنج بار به این خانه اضافه کرده و سپس آنرا چاپ میکند.
, [ > + < - ] > .
در این برنامه ابتدا یک کارکتر از ورودی خوانده می شود. سپس یک حلقه به تعداد بار مقدار
عددی کارکتر، یک عدد به خانه ی دوم اضافه می کند. با این کار در واقع برنامه مقدار ورودی را در خانه ی
دوم کپی می کند. و در نهایت آن را برروی خروجی چاپ می کند.
توجه داشته باشید که ردر بالا فواصل بین دستور ها فقط برای خوانایی بیشتر گذاشته شده اند.
در واقع برنامه بالا به شکل زیر صحیح می باشد.
,[>+<-]>.
حال سعی کنید ببینید که برنامه ی زیر چه کاری انجام می دهد؟
,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >>
این برنامه دو عدد را از ورودی خوانده و با هم ضرب می کند.
ابتدا دو عدد از ورودی خوانده می شوند. سپس حلقه ی بیرونی بر روی خانه شماره یک شروع میشود.
و درون آن حلقه ی دیگری بر روی خانه ی دوم شروع میشود که خانه ی 3 را زیاد میکند.
ولی مشکلی که در اینجا به وجود می آید اینست که در پایان حلقه ی دوم مقدار خانه ی 2 صفر شده
و مقدار اولیه ی آن از دست رفته است. برای حل این مشکل خانه ی شماره چهار هم زیاد میشود
و در پایان حلقه مقدار آن به خانه 2 کپی میشود.
در پایان خانه ی شماره 2 حاوی حاصلضرب خواهد بود.
و این همه ی برین فاک بود! خیلی ساده برای یادگیری ولی سنگین برای به کار بردن.
حال می توانید برای تفریح مشغول نوشتن برنامه ی های مختلف با آن شوید.
و یا یک اجرا کننده برین فاک را با یک زبان دیگر پیاده سازی کنید.
و یا اگر خیلی دوست داشتید یک اجرا کننده ی برین فاک با برین فاک بنویسید!!
Got a suggestion? A correction, perhaps? Open an Issue on the GitHub Repo, or make a pull request yourself!
Originally contributed by Mohammad Valipour, and updated by 2 contributors.