Share this page

Learn X in Y minutes

Where X=bf

Brainfuck (ej versaliserat förutom vid ny mening) är ett extremt minimalistiskt Turing-komplett programmeringsspråk med endast 8 kommandon.

Du kan testa brainfuck i din webbläsare via brainfuck-visualizer.

Alla karaktärer förutom "><+-.,[]" (inte inkluderat citattecken) ignoreras.

Brainfuck är representerat av ett fält med 30 000 celler initialiserade till
noll och en data pekare som pekar på den valda cellen.

Det finns åtta kommandon:
+ : Ökar värdet av den valda cellen med ett.
- : Minskar värdet av den valda cellen med ett.
> : Flyttar data pekaren till nästa cell (cellen till höger).
< : Flyttar data pekaren till förra cellen (cellen till vänster).
. : Skriver ut ASCII värdet av den valda cellen (t.ex. 65 = 'A').
, : Läser in en karaktär till den valda cellen.
[ : Om värdet vid den valda cellen är noll, hoppa till matchande ].
    Annars fortsätts till nästa instruktion.
] : Om värdet vid den valda cellen är noll, fortsätt till nästa instruktion.
    Annars, gå tillbaka till matchande ].

[ och ] formar en while loop.

Nedan är ett exempel på ett simpelt brainfuck program.

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

Programmet skriver ut bokstaven 'A'. Först ökar den värdet av cell #1 till 6.
Cell #1 kommer att användas för att loopa. Sen börjar den loopen (vid '[') och
flyttar till cell #2. Den ökar värdet av cell #2 10 gånger, går tillbaka till
cell #1 och minskar den med 1. Den gör det här 6 gånger (så många iterationer
det tar för cell #1 att bli noll).

Nu är programmet på cell #1, vilket har ett värde av 0 och cell #2 har värdet 60.
Programmet flyttar pekaren till cell #2 och ökar värdet med 5, vilket leder till
att cell #2 har ett värde av 65 (vilket är bokstaven 'A' i ASCII), sedan skriver
den ut cell #2 och bokstaven 'A' skrivs ut till skärmen.


, [ > + < - ] > .

Det här programmet läser en karaktär från användaren och kopierar karaktären
till cell #1. Sedan startas en loop. Pekaren flyttas till cell #2, värder ökas
med ett, pekaren flyttas tillbaka till cell #1 och minskar värdet med ett.
Det här fortsätter tills cell #1 innehåller noll och cell #2 innehåller det
värde som cell #1 innehöll från början. Eftersom att programmet vid slutet av
loopen är på cell #1 flyttas pekaren till cell #2 och sedan skriver den ut
värdet av cell #2 i ASCII.

Värt att komma ihåg är att programmet ovan kan skrivas utan mellanslag också:

,[>+<-]>.


Försök och lista ut vad det här programmet gör:

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

Programmet tar två nummer som indata, och multiplicerar dem.

Kärnan av det är att den först läser in två tal/bokstäver. Sedan startar
den yttre loopen som beror på cell #1. Sedan går den vidare till cell #2 och
startar den innre loopen som beror på cell #2 och ökar cell #3. Men det uppstår
ett problem: Vid slutet av den innre loopen är cell #2 noll. Vilket betyder att
den inre loopen inte kommer att fungera tills nästa gång. För att lösa det här
problemet ökas också cell #4 som sedan kopieras till cell #2.
Sedan är resultatet i cell #3.

Och det är brainfuck. Inte så svårt va? För skojs skull kan du skriva dina egna brainfuck program, eller skriva en egen brainfuck interpretator i ett annat språk. interpretatorn är ganska simpel att implementera, men om man är en masochist, testa att skriva en brainfuck interpretator… i brainfuck.


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 3 contributors.