b'\n_START_ARTICLE_\nBrainfuck\n_START_PARAGRAPH_\nBrainfuck to ezoteryczny j\xc4\x99zyk programowania stworzony przez Urbana M\xc3\xbcllera oko\xc5\x82o roku 1993. Nazywany te\xc5\xbc czasem Brainf*ck, Brainf*** lub po prostu BF.\n_START_SECTION_\nBudowa j\xc4\x99zyka\n_START_PARAGRAPH_\nCelem M\xc3\xbcllera by\xc5\x82o stworzenie j\xc4\x99zyka z jak najmniejsz\xc4\x85 liczb\xc4\x85 instrukcji oraz jak najmniejszego kompilatora. Oryginalny kompilator, napisany na Amig\xc4\x99, ma rozmiar 240 bajt\xc3\xb3w._NEWLINE_Jak sugeruje nazwa, programowanie w tym j\xc4\x99zyku jest trudne. Bez wzgl\xc4\x99du na to w Brainfucku mo\xc5\xbcna zaimplementowa\xc4\x87 dowolny algorytm, poniewa\xc5\xbc j\xc4\x99zyk ten jest zupe\xc5\x82ny w sensie maszyny Turinga. _NEWLINE_J\xc4\x99zyk opiera si\xc4\x99 na prostym modelu maszyny, sk\xc5\x82adaj\xc4\x85cym si\xc4\x99, opr\xc3\xb3cz programu, z tablicy bajt\xc3\xb3w (zazwyczaj 30000) zainicjalizowanych zerami oraz wska\xc5\xbanika do tej tablicy, zainicjalizowanego tak, aby wskazywa\xc5\x82 na jej pierwszy element.\n_START_SECTION_\nHello World!\n_START_PARAGRAPH_\nNast\xc4\x99puj\xc4\x85cy program drukuje napis "Hello World!" na ekranie i przechodzi do nowej linii:_NEWLINE_++++++++++_NEWLINE_[_NEWLINE_>+++++++>++++++++++>+++>+<<<<-_NEWLINE_] Na pocz\xc4\x85tek ustawiamy kilka przydatnych p\xc3\xb3\xc5\xbaniej warto\xc5\x9bci_NEWLINE_>++.               drukuje \'H\'_NEWLINE_>+.                drukuje \'e\'_NEWLINE_+++++++.           drukuje \'l\'_NEWLINE_.                  drukuje \'l\'_NEWLINE_+++.               drukuje \'o\'_NEWLINE_>++.               spacja_NEWLINE_<<+++++++++++++++. drukuje \'W\'_NEWLINE_>.                 drukuje \'o\'_NEWLINE_+++.               drukuje \'r\'_NEWLINE_------.            drukuje \'l\'_NEWLINE_--------.          drukuje \'d\'_NEWLINE_>+.                drukuje \'!\'_NEWLINE_>.                 nowa linia_NEWLINE_Dla wzgl\xc4\x99d\xc3\xb3w czytelno\xc5\x9bci kod programu zosta\xc5\x82 podzielony na kilka linii i zosta\xc5\x82y dodane komentarze. Brainfuck traktuje wszystkie znaki poza +-<>[],. jako komentarz. R\xc3\xb3wnie dobrze powy\xc5\xbcszy program mo\xc5\xbcna by zapisa\xc4\x87 jako:_NEWLINE_++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.\n_START_SECTION_\nCzyszczenie kom\xc3\xb3rki\n_START_PARAGRAPH_\n[-]_NEWLINE_Prosty program, kt\xc3\xb3ry ustawia warto\xc5\x9b\xc4\x87 w aktualnej kom\xc3\xb3rce na 0. M\xc3\xb3wi\xc4\x85c \xc5\x9bci\xc5\x9blej, tak d\xc5\x82ugo dekrementuje warto\xc5\x9b\xc4\x87 w aktualnej kom\xc3\xb3rce, jak d\xc5\x82ugo jest ona wi\xc4\x99ksza od 0.\n_START_SECTION_\nProsta p\xc4\x99tla\n_START_PARAGRAPH_\n,[.,]_NEWLINE_P\xc4\x99tla, kt\xc3\xb3ra pobiera z wej\xc5\x9bcia kolejne znaki i drukuje je na ekranie tak d\xc5\x82ugo, a\xc5\xbc wczytany zostanie znak ko\xc5\x84ca pliku (EOF). W niekt\xc3\xb3rych implementacjach znak EOF ma warto\xc5\x9b\xc4\x87 -1, wtedy odpowiadaj\xc4\x85cy program wygl\xc4\x85da nast\xc4\x99puj\xc4\x85co:_NEWLINE_,+[-.,+]\n_START_SECTION_\nPoruszanie wska\xc5\xbanikiem\n_START_PARAGRAPH_\n>,[.>,]_NEWLINE_Ciekawsza wersja poprzedniego programu, tym razem dodatkowo zapisujemy wej\xc5\x9bcie do kolejnych kom\xc3\xb3rek.\n_START_SECTION_\nDodawanie\n_START_PARAGRAPH_\n[->+<]_NEWLINE_Powy\xc5\xbcszy kod dodaje warto\xc5\x9b\xc4\x87 w aktualnej kom\xc3\xb3rce do nast\xc4\x99pnej kom\xc3\xb3rki. Warto zauwa\xc5\xbcy\xc4\x87, \xc5\xbce zeruje to warto\xc5\x9b\xc4\x87 w aktualnej kom\xc3\xb3rce.\n_START_SECTION_\nWyra\xc5\xbcenie warunkowe w p\xc4\x99tli\n_START_PARAGRAPH_\n,----------[----------------------.,----------]_NEWLINE_Powy\xc5\xbcszy program pobiera wej\xc5\x9bcie (ma\xc5\x82e litery alfabetu angielskiego) zako\xc5\x84czone znakiem nowej linii (czyli wci\xc5\x9bni\xc4\x99ciem entera) i drukuje je, wcze\xc5\x9bniej zwi\xc4\x99kszaj\xc4\x85c litery na wielkie._NEWLINE_Na pocz\xc4\x85tku wczytujemy pierwszy znak i odejmujemy od niego 10 (warto\xc5\x9b\xc4\x87 znaku liczona jest w kodzie ASCII, znak nowej linii ma warto\xc5\x9b\xc4\x87 ASCII 10). Gdyby wczytano znak nowej linii, program zako\xc5\x84czy\xc5\x82by si\xc4\x99, w innym wypadku odejmujemy od niego 22 (razem z poprzednimi 10 odj\xc4\x99li\xc5\x9bmy ju\xc5\xbc 32, czyli r\xc3\xb3\xc5\xbcnic\xc4\x99 mi\xc4\x99dzy odpowiednimi ma\xc5\x82ymi i wielkimi literami), drukujemy na ekranie, po czym znowu wczytujemy znak, odejmujemy 10 i wracamy do pocz\xc4\x85tku p\xc4\x99tli.\n_START_SECTION_\nKopiowanie warto\xc5\x9bci z kom\xc3\xb3rki\n_START_PARAGRAPH_\n(Jako \xc5\xbce przyk\xc5\x82ady robi\xc4\x85 si\xc4\x99 coraz bardziej skomplikowane, przyjmijmy dla u\xc5\x82atwienia, \xc5\xbce [0], [1], [2] i tak dalej odnosz\xc4\x85 si\xc4\x99 do kolejnych kom\xc3\xb3rek)_NEWLINE_Powiedzmy, \xc5\xbce chcemy skopiowa\xc4\x87 warto\xc5\x9b\xc4\x87 z [0] do [1]. Najprostszym sposobem jest intuicyjne:_NEWLINE_[->+<]_NEWLINE_Niestety, takie wywo\xc5\x82anie ustawi warto\xc5\x9b\xc4\x87 w [0] na 0. Aby odzyska\xc4\x87 pocz\xc4\x85tkow\xc4\x85 warto\xc5\x9b\xc4\x87 [0], mo\xc5\xbcemy przekopiowa\xc4\x87 [0] do [1] i [2] r\xc3\xb3wnocze\xc5\x9bnie, a nast\xc4\x99pnie kopiuj\xc4\x85c warto\xc5\x9b\xc4\x87 z [2] do [0]. Program realizuj\xc4\x85cy to zadanie wygl\xc4\x85da tak:_NEWLINE_[->+>+<<]      kopiujemy z (0) do (1) i (2)_NEWLINE_>>[-<<+>>]<<   kopiujemy z (2) do (0)\n_START_SECTION_\nNietrywialne\n_START_PARAGRAPH_\nPoni\xc5\xbcej wida\xc4\x87 proste implementacje podstawowych operacji arytmetycznych. S\xc4\x85 one bardzo uproszczone, tzn. wej\xc5\x9bciem s\xc4\x85 dwie cyfry, tak\xc5\xbce wynik musi by\xc4\x87 cyfr\xc4\x85.\n_START_SECTION_\nDodawanie\n_START_PARAGRAPH_\n,>++++++[<-------->-],[<+>-]<._NEWLINE_Program wczytuje dwie jednocyfrowe liczby i drukuje rezultat dodawania. Niestety, program zadzia\xc5\x82a poprawnie tylko wtedy, gdy rezultat jest cyfr\xc4\x85._NEWLINE_43_NEWLINE__NEWLINE_7_NEWLINE_Wczytujemy do [0] pierwsz\xc4\x85 cyfr\xc4\x99 i odejmujemy od niej 48 (kody ASCII dla cyfr 0-9 to 48-57). Odejmowanie to jest zrobione za pomoc\xc4\x85 prostej p\xc4\x99tli: najpierw wstawiamy 6 do [1], a nast\xc4\x99pnie tak d\xc5\x82ugo, jak [1] jest r\xc3\xb3\xc5\xbcna od zera odejmujemy 8 od [0], i w ko\xc5\x84cu odejmujemy 1 od [1]. Nast\xc4\x99pnie wczytujemy drug\xc4\x85 cyfr\xc4\x99 do [1]. Nast\xc4\x99pna p\xc4\x99tla [<+>-] dodaje drug\xc4\x85 liczb\xc4\x99 do pierwszej i zeruje [1]. Na ko\xc5\x84cu drukujemy warto\xc5\x9b\xc4\x87 z [0].\n_START_SECTION_\nMno\xc5\xbcenie\n_START_PARAGRAPH_\n,>,>++++++++[<------<------>>-]_NEWLINE_<<[>[>+>+<<-]>>[<<+>>-]<<<-]_NEWLINE_>>>++++++[<++++++++>-]<._NEWLINE_Podobnie jak poprzednio, jednak tym razem mno\xc5\xbcymy zamiast dodawa\xc4\x87. _NEWLINE_Pierwsz\xc4\x85 cyfr\xc4\x99 przechowujemy w [0], drug\xc4\x85 w [1]. Obie zmniejszamy o 48._NEWLINE_Tutaj zaczyna si\xc4\x99 p\xc4\x99tla g\xc5\x82\xc3\xb3wna programu. Dzia\xc5\x82amy wed\xc5\x82ug zasady: odejmij 1 od [0], po czym dodaj warto\xc5\x9b\xc4\x87 z [1] do [2]._NEWLINE_Na ko\xc5\x84cu dodajemy 48 do [2] i drukujemy rezultat na ekranie.\n_START_SECTION_\nDzielenie\n_START_PARAGRAPH_\n,>,>++++++[-<--------<-------->>] przechowuje dwie cyfry w (0) i (1) od obu odejmujemy 48_NEWLINE_<<[                               powtarzaj dop\xc3\xb3ki dzielna jest niezerowa_NEWLINE_>[->+>+<<]                        kopiuj dzielnik z (1) do (2) i (3) (1) si\xc4\x99 zeruje_NEWLINE_>[-<<-                            odejmujemy 1 od dzielnej (0) i dzielnika (2) dop\xc3\xb3ki (2) nie jest 0_NEWLINE_[>]>>>[<[>>>-<<<[-]]>>]<<]        je\xc5\xbceli dzielna jest zerem wyjd\xc5\xba z p\xc4\x99tli_NEWLINE_>>>+                              dodaj jeden do ilorazu w (5)_NEWLINE_<<[-<<+>>]                        kopiuj zapisany dzielnik z (3) do (1)_NEWLINE_<<<]                              przesu\xc5\x84 wska\xc5\xbanik na (0) i powt\xc3\xb3rz p\xc4\x99tl\xc4\x99_NEWLINE_>[-]>>>>[-<<<<<+>>>>>]            kopiuj iloraz z (5) do (0)_NEWLINE_<<<<++++++[-<++++++++>]<.         dodaj 48 i drukuj wynik_NEWLINE_Po wczytaniu dw\xc3\xb3ch cyfr powy\xc5\xbcszy program oblicza ich iloraz (ignoruj\xc4\x85c reszt\xc4\x99) i drukuje go na ekranie.'