डोक्याची मंडई

Submitted by अभि_नव on 21 January, 2018 - 03:53

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

नाही, हे चुकुन लिहिलेले नाही. तुमचा बेव ब्राऊजर किंवा मोबाईल फोन अ‍ॅप व्यवस्थीत चालु आहे. तुम्ही वर वाचलेत ते अगदी तसेच लिहिले आहे. ही एका संगणकीय भाषेत लिहिलेली छोटीशी आज्ञावली आहे. चक्रावलात ना? या लेखात याच संगणकीय भाषेची तोंडओळख करुन घेणार आहोत.

संगणकाची आज्ञावली, म्हणजे विशिष्ट सुचनांचा एक संच असतो जो वापरुन माणुसप्राणी संगणकाला योग्य ती आज्ञा देऊन हवे ते काम करवुन घेऊ शकतो. या आज्ञावलींचे अनेक प्रकार असतात. त्यातला एक प्रकार म्हणजे High Level Programming Languages. यात ती आज्ञावली माणसाला वाचण्यासाठी सुलभ अशी बनवलेली असते व संगणकातील अनेक प्राथमीक पातळीच्या तपशीलांना समोर येऊ न देता आज्ञा तयार करण्याचे काम सोपे व्हावे; अशा हेतुने रचलेली असते.

अशा प्रकारच्या भाषांमधे वापरलेला सुचनांचा संच हा तुलनेने खुप मोठा असतो. यापैकी काही प्रसिद्ध संगणकीय भाषांची नावे तुम्ही एकली असतील जसे की, C, C++, Visual Basic, Python, Dot Net, Lisp, Ruby, Perl वगैरे.

Python या भाषेत लिहिलेल अतिशय सोपा असा एक ओळीचा प्रोग्राम खाली दिला आहे.

print ("Jay Maharashtra!")

वरील ओळ वाचुन तुम्हाला हे लगेच समजेल की "जय महाराष्ट्र" हे वाक्य "प्रिंट" करण्याची ही अज्ञावली आहे. अजुन खोलात गेल्यास तुम्हाला लक्षात येईल की पायथॉन व तत्सम संगणकीय भाषा या अशा माणसाला वाचण्यासाठी सोप्या बनवलेल्या आहेत व त्याने आज्ञावली लिहिण्याचे काम खुप सोपे होते.

परंतु, आज या लेखात आपण अशा एका संगणकीय भाषेची ओळख करुन घेणार आहोत, जी जाणुन बुजुन, माणसाला वाचायला अति कठीण व फारच तोकड्या अशा सुचनांचा संच वापरुन बनवलेली आहे.

Brainfuck असे या भाषेचे नाव असुन, १९९३ मधे उर्बन मुल्लेर (Urban Müller) यांनी ती बनवली आहे. ब्रेनफक ही एक प्रकारची Esoteric Programming Language आहे. इसोटेरीक किंवा इसोलँग या प्रकारच्या संगणकीय भाषा रचन्यामागचा उद्देश, संगणकीय भाष रचनेमधे प्रयोग करणे, नव्या कल्पना मांडणे, सॉफ्टवेअर कला प्रकार म्हणून, केवळ विनोद म्हणुन किंवा हॅकींगसाठी उपयोग करणे असा; किंवा यापैकी एखादा असतो. या भाषा नेहमीच्या व्यावसायीक उपयोजीतेसाठी वापरल्या जात नाहीत.

ब्रेनफक या भाषेत केवळ आठच सुचना व एक ईंस्ट्रक्शन पॉईंटर असतो. ब्रेनफक या भाषेत आज्ञावली कशी लिहावी ते आता बघु. त्याआधी ब्रेनफकमधील आज्ञावली सुचनांची यादी, सुचना व त्याखाली त्याचे वर्णन या स्वरुपात खालीलप्रमाणे:

>
डेटा पॉईंटर एक ने वाढवुन उजव्या बाजुच्या पुढच्या डेटा पॉईंटरवर न्या

<
डेटा पॉईंटर एक ने कमी करुन डाव्या बाजुच्या मागच्या डेटा पॉईंटरवर न्या

+
चालु पॉईंटरमधील बाईट डेटा एक ने वाढवा

-
चालु पॉईंटरमधील बाईट डेटा एक ने कमी करा

.
चालु पॉईंटरमधील एक बाईट डेटाचा आउटपुट घ्या

,
चालु पॉईंटरमधे एक बाईट डेटाचा इनपुट घ्या

[
जर चालु डेटा पॉईंटर मधील बाईट डेटा शुन्य असेल तर, इन्स्ट्रक्शन पॉईंटर पुढच्या सुचनेवर नेण्याएवजी, याच्या जोडीतील बंद ] (Closing Square Bracket) च्या पुढच्या सुचनेवर न्या.

]
जर चालु डेटा पॉईंटर मधील बाईट डेटा शुन्येतर असेल तर, इन्स्ट्रक्शन पॉईंटर पुढील सुचनेवर नेण्याएवजी, या जोडीतील सुरुवातीच्या [ (Opening Square Bracket) च्या पुढच्या सुचनेवर न्या.

कल्पना करा की आपण ही आज्ञावली एका टेपवर लिहीत आहोत.

  1. ही टेप डावीकडुन उजवीकडे व परत अशी वाचली जाऊ शकते.
  2. टेप मधे सेल्स आहेत व या सेल्व मधे डेटा लिहिला जाऊ शकतो व वाचला जाऊ शकतो.
  3. एका सेल मधे १ बाईट डेटा साठवला जातो

ही टेप सुरुवातील अशी दिसत असेलः

brainfuck_tape_1

लाल रंगाच्या बाणाने डेटा पॉईंटर दाखवलेला आहे. सद्ध्या तो पहिल्या सेल वर आहे. टेपमधील सुरुवातीचा डेटा:
brainfuck_tape_2
वरील सुचनासंच व टेपबद्दलची माहिती वापरुन आता आपण, दोन संख्यांची बेरीज करण्याचा एक सोपा प्रोग्राम लिहु.

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

साभार विकीपीडीया: https://en.wikipedia.org/wiki/Brainfuck

वरील आज्ञावलीचा स्युडो अल्गोरिदमः

  1. सर्वप्रथम सेल १ मधे, दोन ही संख्या व सेल २ मधे पाच ही संख्या भरु. हे आपले इनपुट आहेत.
  2. पहिल्या संख्येमधे एक ने वाढ केली व दुसरी संख्या एक ने कमी केली, असे तोपर्यंत केले जोपर्यंत दुसरी संख्या शुन्य होत नाही. जेणेकरुन या लुपच्या शेवटी आपल्याला या दोन संख्यांची बेरीज करुन आलेली संख्या पहिल्या सेल मधे मिळेल.
  3. आणखी एका लुप चा वापर करुन, आधी मिळालेल्या बेरजे मधे अट्ठेचाळीस ही संख्या मिळवली आहे. असे केल्याने आपला आउटपुट, ASCII या आपल्याला समजणा-या स्वरुपात मिळेल.

वरील आज्ञावलीतील सुचना एकावेळेला एक या प्रमाणे वाचुन त्याचे वरील टेप मधे काय बदल दिसतात ते खाली दाखवले आहे. जी सुचना सद्ध्य वाचली जात आहे ती लाल रंगात दाखवली आहे.

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

सुचना: चालु पॉईंटरमधील बाईट डेटा एक ने वाढवा

brainfuck_tape_3

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

सुचना: चालु पॉईंटरमधील बाईट डेटा एक ने वाढवा

brainfuck_tape_4
सेल १ मधे दोन ही संख्या टाकली आहे.

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

सुचना: डेटा पॉईंटर एक ने वाढवुन उजव्या बाजुच्या पुढच्या पॉईंटरवर न्या

bf5

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

या पाच सुचना एकामागोमाग एक वाचल्यानंतर, चालु पॉईंटर मधील डेटा पाच ने वाढलेला असेल.

bf6
सेल २ मधे पाच ही संख्या टाकली आहे.

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

सुचना: जर चालु डेटा पॉईंटर मधील बाईट डेटा शुन्य असेल तर, इन्स्ट्रक्शन पॉईंटर पुढच्या सुचनेवर नेण्याएवजी, याच्या जोडीतील बंद ] (Closing Square Bracket) च्या पुढच्या सुचनेवर न्या.

परंतु, चालु डेटा पॉईंटर मधील डेटा शुन्य नसुन पाच ही संख्या आहे. त्यामुळे आपण पुढच्या सुचनेवर जाणार आहोत.

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

सुचना: डेटा पॉईंटर एक ने कमी करुन डाव्या बाजुच्या मागच्या डेटा पॉईंटरवर न्या

bf7

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

सुचना: चालु पॉईंटरमधील बाईट डेटा एक ने वाढवा

bf8

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

सुचना: डेटा पॉईंटर एक ने वाढवुन उजव्या बाजुच्या पुढच्या पॉईंटरवर न्या

bf9

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

सुचना: चालु पॉईंटरमधील बाईट डेटा एक ने कमी करा

bf10

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

सुचना: जर चालु डेटा पॉईंटर मधील बाईट डेटा शुन्येतर असेल तर, इन्स्ट्रक्शन पॉईंटर पुढील सुचनेवर नेण्याएवजी, या जोडीतील सुरुवातीच्या [ (Opening Square Bracket) च्या पुढच्या सुचनेवर न्या.

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

सुचना: डेटा पॉईंटर एक ने कमी करुन डाव्या बाजुच्या मागच्या डेटा पॉईंटरवर न्या

bf11

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

सुचना: चालु पॉईंटरमधील बाईट डेटा एक ने वाढवा

bf12

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

सुचना: डेटा पॉईंटर एक ने वाढवुन उजव्या बाजुच्या पुढच्या पॉईंटरवर न्या

bf13

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

सुचना: चालु पॉईंटरमधील बाईट डेटा एक ने कमी करा

bf14

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

सुचना: जर चालु डेटा पॉईंटर मधील बाईट डेटा शुन्य असेल तर, इन्स्ट्रक्शन पॉईंटर पुढच्या सुचनेवर नेण्याएवजी, याच्या जोडीतील बंद ] (Closing Square Bracket) च्या पुढच्या सुचनेवर न्या.

[ < + > - ] हा मुख्य लुप आहे हे तुमच्या लक्षात आले असेलच. हा लुप पुर्ण पाच वेळा चालवल्यानंतर, खाली दाखवल्याप्रमाणे सेल १ मधे बेरीजेची संख्या आलेली असेल व सेल २ मधे शुन्य ही संख्या आलेली असेल.

bf15

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

सुचना: जर चालु डेटा पॉईंटर मधील बाईट डेटा शुन्य असेल तर, इन्स्ट्रक्शन पॉईंटर पुढच्या सुचनेवर नेण्याएवजी, याच्या जोडीतील बंद ] (Closing Square Bracket) च्या पुढच्या सुचनेवर न्या.

पहिल्या मुख्य लुपच्या शेवटी आपण आलेलो आहोत. पहिल्या सेल मधे बेरीज मिळालेली आहे. चालु पॉईंटरमधील डेटा शुन्य असल्यामुळे, लुप परत चालु न करता आपण पुढच्य सुचनेवर जाणार आहोत.

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

आता इथे आठ वेळा + ही सुचना आहे. स्युडो अल्गोरिदम मधे सांगितल्याप्रमाणे, आपल मुळच्या बेरजेमधे अट्ठेचाळीस ही संख्या मिळवणार आहोत, जेणेकरुन आपल्याला ASCII या प्रकारात आपली बेरजेची संख्या मिळेल. यासाठी अट्ठेचाळीस वेळा + ही सुचना न लिहिता, आपण एका सेल मधे ८ व दुसर्या सेल मधे ६ ही संख्या लिहुन, त्यांचा लुप बनवणार आहोत. त्या लुपच्या शेवटी आपल्याला ८ * ६ = ४८ ही संख्या व तेवढ्या वेळा + ही सुचना मिळालेली असेल.

ही अट्ठेचाळीस संख्या आपल्या बेरजेच्या सात या संख्ये मधे मिळवल्यानंतर, या लुपच्या शेवटी सेल १ मधे ५५ व सेल २ मधे शुन्य अशा संख्या मिळालेल्या असतील. ASCII मधे ५५ म्हणजे "७".

bf16

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

सुचना: डेटा पॉईंटर एक ने कमी करुन डाव्या बाजुच्या मागच्या डेटा पॉईंटरवर न्या

bf17

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

सुचना: चालु पॉईंटरमधील एक बाईट डेटाचा आउटपुट घ्या

7

आता तुम्ही सांगा की, या लेखाच्या सुरुवातीला दिलेली आज्ञावली नक्की काय आउटपुट देईल?

गृहपाठः

  1. वर दिलेली बेरजेची आज्ञावली सुधारुन, त्यात वापरकर्त्याकडुन दोन संख्या इनपुट घेऊन त्यांची बेरीज करण्याची आज्ञावली लिहा!
  2. दोन संख्यांचा गुणाकार करण्याची आज्ञावली लिहा!

Features Image for this blog post taken from this Flickr page.

इतरत्र पुर्वप्रकाशीत.

अशा प्रकारचे इतर लेख वाचण्यासाठी इथे भेट द्या.

Groups audience: 
Group content visibility: 
Public - accessible to all site users

तुफान अल्गोरिदम... एकदम शाळेत असताना लिहिलेले अल्गोरिदम्स आठवले.. आणि डोक्याची मंडई हे लेखाचे नाव एकदम सार्थ आहे.

धन्यवाद टीना व हिम्सकुल.

या लेखात वापरलेली चित्रं आधीच्या जागेवरुन नव्या जागेत नेल्यामुळे, ती इथे दिसत नाहीयेत.
चित्रासहीत मुळ लेख वाचण्यासाठी इथे भेट द्या.

अशीच एक एसोटेरिक व्हाईटस्पेस लँग्वेज आहे. बाकी (मोस्टली) भाषांत एका किंवा मल्टिपल व्हाईट स्पेसला महत्त्व दिलं जात नाही तर या भाषेत नॉन व्हाईटस्पेसला महत्व नाही. Proud

महेश जरुर वाचा.

च्रप्स, जमेल हो.
त्या आधी, या लेखात दिलेल्या गृहपाठातील पहिला स्वाध्याय करुन पहा.

अमितव, छान माहिती. व्हाईटस्पेस भाषेत लिहिलेली आज्ञावली; पायथॉन व्यतिरिक्त इतर भाषांमधे लिहिलेल्या आज्ञावलीत लपवता येऊ शकते व तो कोड पॉलिग्लॉट होऊ शकतो.