1. พื้นฐาน
เพื่อให้เข้าใจ Brainfuck คุณต้องจินตนาการถึงอาร์เรย์ของเซลล์ที่เริ่มต้นโดย0
แต่ละเซลล์
...[0][0][0][0][0]...
เมื่อโปรแกรม Brainfuck เริ่มต้นจะชี้ไปที่เซลล์ใด ๆ
...[0][0][*0*][0][0]...
หากคุณเลื่อนตัวชี้ไปทางขวาแสดง>
ว่าคุณกำลังย้ายตัวชี้จากเซลล์ X ไปยังเซลล์ X + 1
...[0][0][0][*0*][0]...
หากคุณเพิ่มมูลค่าเซลล์+
คุณจะได้รับ:
...[0][0][0][*1*][0]...
หากคุณเพิ่มมูลค่าเซลล์อีกครั้ง+
คุณจะได้รับ:
...[0][0][0][*2*][0]...
หากคุณลดค่าเซลล์-
คุณจะได้รับ:
...[0][0][0][*1*][0]...
หากคุณย้ายตัวชี้ไปทางซ้ายแสดง<
ว่าคุณกำลังย้ายตัวชี้จากเซลล์ X ไปยังเซลล์ X-1
...[0][0][*0*][1][0]...
2. อินพุต
,
หากต้องการอ่านตัวอักษรที่คุณใช้เครื่องหมายจุลภาค มันทำอะไร: อ่านอักขระจากอินพุตมาตรฐานและเขียนรหัส ASCII ทศนิยมไปยังเซลล์จริง
ลองดูที่ตาราง ASCII ตัวอย่างเช่นรหัสทศนิยม!
คือ33
ในขณะที่มีa
97
ลองนึกภาพหน่วยความจำโปรแกรม BF ของคุณเป็นดังนี้:
...[0][0][*0*][0][0]...
สมมติว่าอินพุตมาตรฐานย่อมาจากa
ถ้าคุณใช้,
ตัวดำเนินการลูกน้ำสิ่งที่ BF ทำคืออ่านa
รหัส ASCII ทศนิยม97
ไปยังหน่วยความจำ:
...[0][0][*97*][0][0]...
โดยทั่วไปคุณอยากจะคิดแบบนั้นอย่างไรก็ตามความจริงนั้นซับซ้อนกว่าเล็กน้อย ความจริงก็คือ BF ไม่ได้อ่านอักขระ แต่เป็นไบต์ (ไบต์คืออะไร) ให้ฉันดูตัวอย่าง:
ในลินุกซ์
$ printf ł
พิมพ์:
ł
ซึ่งเป็นลักษณะเฉพาะของโปแลนด์ อักขระนี้ไม่ได้เข้ารหัสโดยการเข้ารหัส ASCII ในกรณีนี้เป็นการเข้ารหัส UTF-8 ดังนั้นจึงเคยใช้หน่วยความจำคอมพิวเตอร์มากกว่าหนึ่งไบต์ เราสามารถพิสูจน์ได้โดยการถ่ายโอนข้อมูลฐานสิบหก:
$ printf ł | hd
ซึ่งแสดง:
00000000 c5 82 |..|
ศูนย์จะถูกชดเชย 82
เป็นc5
ไบต์แรกและเป็นไบต์ที่สองแทนł
(ตามลำดับเราจะอ่าน) |..|
เป็นการแสดงกราฟิกซึ่งไม่สามารถทำได้ในกรณีนี้
ถ้าคุณส่งł
อินพุตไปยังโปรแกรม BF ของคุณที่อ่านไบต์เดียวหน่วยความจำโปรแกรมจะมีลักษณะดังนี้:
...[0][0][*197*][0][0]...
ทำไม197
? 197
ทศนิยมดีเป็นc5
เลขฐานสิบหก ดูเหมือนจะคุ้นเคย? แน่นอน. เป็นไบต์แรกของł
!
3. เอาต์พุต
ในการพิมพ์อักขระที่คุณใช้จุด.
คืออะไร: สมมติว่าเราปฏิบัติตามค่าของเซลล์จริงเช่นรหัส ASCII ทศนิยมให้พิมพ์อักขระที่สอดคล้องกับเอาต์พุตมาตรฐาน
ลองนึกภาพหน่วยความจำโปรแกรม BF ของคุณเป็นดังนี้:
...[0][0][*97*][0][0]...
หากคุณใช้ตัวดำเนินการ dot (.) ในตอนนี้สิ่งที่ BF ทำคือพิมพ์:
a
เพราะa
รหัสทศนิยมใน ASCII 97
คือ
ตัวอย่างเช่นโปรแกรม BF เช่นนี้ (97 บวก 2 จุด):
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++ ..
จะเพิ่มมูลค่าของเซลล์ที่ชี้ได้ถึง 97 และพิมพ์ออกมา 2 ครั้ง
AA
4. ลูป
ใน BF วงประกอบด้วยวงเริ่มต้นและจุดสิ้นสุดห่วง[
]
คุณสามารถคิดว่ามันเหมือนกับใน C / C ++ ที่เงื่อนไขคือค่าเซลล์จริง
ดูโปรแกรม BF ด้านล่าง:
++[]
++
เพิ่มค่าเซลล์จริงสองครั้ง:
...[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)
อย่างไรก็ตามเป็นแนวทางปฏิบัติที่ดีที่จะยุติจุดเริ่มต้น ทำไม? เนื่องจากถ้าลูปสิ้นสุดเซลล์อื่นเซลล์เริ่มต้นเราไม่สามารถสันนิษฐานได้ว่าตัวชี้เซลล์จะอยู่ที่ใด พูดตามตรงการปฏิบัตินี้ทำให้ Brainfuck สมองน้อยลง