Share this page

Learn X in Y minutes

Where X=brainfuck

Brainfuck (pisane małymi literami, za wyjątkiem początku zdania) jest bardzo minimalistycznym, kompletnym w sensie Turinga, językiem programowania. Zawiera zaledwie 8 poleceń.

Możesz przetesotwać brainfucka w swojej przeglądarce, korzystając z narzędzia brainfuck-visualizer.

Wszystkie znaki oprócz "><+-.,[]" (wyłączając znaki zapytania) są ignorowane.

Pamięć w brainfucku jest reprezentowana przez tablicę 30.000 komórek
zainicjalizowanych zerami, ze wskaźnikiem pokazującym na aktualną komórkę.

Oto osiem poleceń brainfucka:
+ : inkrementuje (zwiększa o jeden) wartość aktualnie wskazywanej komórki
- : dekrementuje (zmniejsza o jeden) wartość aktualnie wskazywanej komórki
> : przesuwa wskaźnik na następną komórkę (w prawo)
< : przesuwa wskaźnik na poprzednią komórkę (w lewo)
. : wyświetla wartość bieżącej komórki (w formie znaku ASCII, np. 65 = 'A')
, : wczytuje (jeden) znak z wejścia do bieżącej komórki
    (konkretnie jego numer z tabeli ASCII)
[ : jeśli wartość w bieżącej komórce jest równa zeru, przechodzi do
    odpowiadającego ]; w przeciwnym wypdaku przechodzi do następnej instrukcji
] : Jeśli wartość w bieżącej komórce jest równa zeru, przechodzi do
    następnej instrukcji; w przeciwnym wypdaku przechodzi do odpowiadającego [

[ i ] oznaczają pętlę while. Oczywiście każda pętla rozpoczęta [
musi być zakończona ].

Zobaczmy kilka prostych programów w brainfucku.


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

Ten program wypisuje literę 'A'. Najpierw zwiększa wartość komórki #1 do 6.
Komórka #1 będzie wykorzystana w pętli. Następnie program wchodzi w pętlę ([)
i przechodzi do komórki #2. Pętla wykonuje się sześć razy (komórka #1 jest
dekrementowana sześć razy, nim osiągnie wartość zero, kiedy to program
przechodzi do odpowiadającego ] i wykonuje kolejne instrukcje).

W tym momencie wskaźnik pokazuje na komórkę #1, mającą wartość 0, podczas gdy
komórka #2 ma wartość 60. Przesuwamy wskaźnik na komórkę #2, inkrementujemy ją
pięć razy, uzyskując wartość 65. Następnie wyświetlamy wartość komórki #2.
65 to 'A' w tabeli ASCII, więc właśnie ten znak jest wypisany na konsolę.


, [ > + < - ] > .

Ten program wczytuje znak z wejścia i umieszcza jego kod ASCII w komórce #1.
Następnie zaczyna się pętla, w której znajdują się następujące instrukcje: 
przesunięcie wskaźnika na komórkę #2, inkrementacja wartości komóri #2,
powrót do komórki #1 i dekrementacja wartości komórki #1. Instrukcje pętli
wykonują się aż wartość komórki #1 osiągnie zero, a komórka #2 osiągnie
poprednią wartość komórki #1. Ponieważ na końcu pętli wskaźnik pokazuje na
komórkę #1, po pętli następuje instrukcja przejścia do komórki #2 i wysłanie
jej wartości (w formie znaku ASCII) na wyjście.

Zauważ, że odstępy służą wyłącznie poprawie czytelności.
Równie dobrze można powyższy program zapisać tak:

,[>+<-]>.


Spróbuj odgadnąć, co robi poniższy program:

,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >>

Ten program pobiera z wejścia dwie liczby i je mnoży.

Po wczytaniu dwóch wejść (do komórek #1 i #2) następuje pętla zewnętrzna,
warunkowana wartością komórki #1. Następnie program przechodzi do komórki #2
i rozpoczyna pętlę wewnętrzną z warunkiem zakończenia w komórce #2,
inkrementującą komórkę #3. Tu jednak pojawia się problem: w chwili zakończenia
wewnętrznej pętli komórka #2 ma wartość zero. W takim razie wewętrzna pętla
nie wywoła się następny raz. Aby rozwiązać ten problem, inkrementujemy także
wartość komórki #4, a następnie kopiujemy jej wartość do komórki #2.
Ostatecznie wynik działania znajduje się w komórce #3.

I to właśnie jest brainfuck. Nie taki trudny, co? W ramach rozrywki możesz napisać własne programy w brainfucku. Możesz też napisać interpreter brainfucka w innym języku. Implementacja interpretera to dość proste zadanie. Jeśli jesteś masochistą, spróbuj napisać interpreter brainfucka w... brainfucku.


Got a suggestion? A correction, perhaps? Open an Issue on the GitHub Repo, or make a pull request yourself!

Originally contributed by Prajit Ramachandran, and updated by 4 contributors.