2015-09-02 15:33:01 +03:00
|
|
|
---
|
2017-08-23 00:10:14 +03:00
|
|
|
category: language
|
2016-02-12 22:42:25 +03:00
|
|
|
language: bf
|
2017-08-25 11:08:25 +03:00
|
|
|
filename: learnbf-pl.bf
|
2015-09-02 15:33:01 +03:00
|
|
|
contributors:
|
|
|
|
- ["Prajit Ramachandran", "http://prajitr.github.io/"]
|
|
|
|
- ["Mathias Bynens", "http://mathiasbynens.be/"]
|
|
|
|
translators:
|
|
|
|
- ["Jakub Młokosiewicz", "https://github.com/hckr"]
|
2019-10-03 23:45:27 +03:00
|
|
|
- ["Mateusz Burniak", "https://github.com/matbur"]
|
2015-09-02 15:33:01 +03:00
|
|
|
lang: pl-pl
|
2017-08-25 11:08:25 +03:00
|
|
|
|
2015-09-02 15:33:01 +03:00
|
|
|
---
|
|
|
|
|
|
|
|
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](http://fatiherikli.github.io/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)
|
2019-10-03 20:15:23 +03:00
|
|
|
[ : jeśli wartość w bieżącej komórce jest równa zeru, przechodzi do
|
2015-09-02 15:33:01 +03:00
|
|
|
odpowiadającego ]; w przeciwnym wypdaku przechodzi do następnej instrukcji
|
2019-10-03 20:15:23 +03:00
|
|
|
] : Jeśli wartość w bieżącej komórce jest równa zeru, przechodzi do
|
2015-09-02 15:33:01 +03:00
|
|
|
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.
|