2015-10-28 20:49:05 +03:00
|
|
|
---
|
|
|
|
language: brainfuck
|
2017-08-25 11:28:59 +03:00
|
|
|
filename: brainfuck-sv.bf
|
2015-10-28 20:49:05 +03:00
|
|
|
contributors:
|
|
|
|
- ["Prajit Ramachandran", "http://prajitr.github.io/"]
|
|
|
|
- ["Mathias Bynens", "http://mathiasbynens.be/"]
|
|
|
|
translators:
|
|
|
|
- ["Richard Lindberg", "https://github.com/Lidenburg"]
|
2016-03-15 21:03:03 +03:00
|
|
|
lang: sv-se
|
2015-10-28 20:49:05 +03:00
|
|
|
---
|
|
|
|
|
|
|
|
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](http://fatiherikli.github.io/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.
|
|
|
|
|
2016-03-15 21:03:03 +03:00
|
|
|
Värt att komma ihåg är att programmet ovan kan skrivas utan mellanslag också:
|
2015-10-28 20:49:05 +03:00
|
|
|
|
|
|
|
,[>+<-]>.
|
|
|
|
|
|
|
|
|
|
|
|
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.
|