Kodecafe - Brainfuck
Denne projektformulering tager udgangspunkt i denne.
Et Brainfuck program har følgende ting at arbejde med:
- Programkode: Et array af tegn, hvis betydning beskrives nedenfor, som læses et af gangen.
- Programkode-pointer: Et index ind i programkoden, der fortæller hvor langt gennem programmet vi er nået.
- Hukommelse: Et array af tal. Det er normalt 30000 stort og alle værdier starter som 0.
- Hukommelse-pointer: Et index ind i hukommelsen, der fortæller hvilken celle vi er ved lige nu.
Et tegn i programkoden læses og den tilsvarende kommando udføres, hvorefter man flytter programkode-pointeren videre til næste tegn (med mindre der er tale om et loop).
Der er 8 tegn, som svarer til 8 kommandoer:
>
: Tæl hukommelse-pointeren en op, i.e. flyt pointeren en celle til højre.<
: Tæl hukommelse-pointeren en ned, i.e. flyt pointeren en celle til venstre.+
: Tæl tallet i den nuværende celle en op.-
: Tæl tallet i den nuværende celle en ned..
: Tag tallet i den nuværende celle og print det som et ASCII tegn.,
: Læs et tegn fra terminalen og gem det i den nuværende celle.[
: Hvis tallet i den nuværende celle er forskellige fra 0, udfør kommandoer indtil den matchende]
mødes. Hvis tallet i den nuværende celle er 0, så springes hen forbi den matchende]
.]
: Spring tilbage til den matchende[
.
Andre tegn skal bare ignoreres.
Det foreslås at man laver følgende udvidelse:
:
: Print tallet i den nuværende celle som et tal i stedet for et ASCII tegn.;
: Læs et tal fra terminalen og gem i den nuværende celle.
Eksempler
Print “5”:
1
+++++:
Print “!”:
1
++++++++ ++++++++ ++++++++ ++++++++ +.
Print “Hello World!”:
1
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Læg 3 og 2 sammen:
1
+++>++<[->+<]>:
Hjælp til at komme i gang
- Start med at kunne læse programmet igennem fra venstre til højre, tegn for tegn.
- Få dernæst
>
,<
,+
,-
,.
,,
,:
og;
til at virke. - Læg en strategi for hvordan
]
ved hvilken[
den skal springe tilbage til og hvordan[
ved hvilken]
den skal springe frem til, hvis den nuværende celle er 0. Et hint kan være at bruge et stak, men der er mange måder at gøre det på. - Bonus: Prøv at gøre, så interpreteren kan læse inputtet fra en fil.