Для непосвященных, Brainfuck - это полный по Тьюрингу язык только с 8 командами, каждая из которых имеет буквальный эквивалент в C:
bf c
----------------------
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr=getchar();
[ while (*ptr) {
] }
В любом дистрибутиве Linux, в котором есть менеджер пакетов, вы должны иметь возможность найти и установить пакет beef
, интерпретатор Brainfuck, чтобы вы могли поиграть дома.
Как вы можете видеть выше, Brainfuck имеет только одну управляющую структуру, […]
, которая переводится в C как:
while (*ptr) { … }
Что дает вам полный контроль над IF VAR = 0 THEN GOTO 10
от Бейсика. Следующий вызов будет вызывать getchar()
, пока не вернется 0
:
, # *ptr = getchar();
[ # while (*ptr) {
>, # *(++ptr) = getchar();
] # }
Но что, если я только хочу прочитать символ новой строки \n
? После некоторых трудностей, связанных с тем, как это можно приспособить, чтобы работать как простой if
, я придумал следующее:
, # *ptr = getchar(); /* store input */
---------- # *ptr -= 10; /* test for \n by subtracting 10 before loop */
[ # while (*ptr) { /* if *ptr == 0, last char read was \n */
++++++++++ # *ptr += 10; /* wasn't \n, add 10 back to val under ptr */
>, # *(++ptr) = getchar();
---------- # *ptr -= 10;
] # }
(Если у кого-то есть лучший способ сделать это, пожалуйста, дайте мне знать)
Теперь допустим, что я хочу протестировать разрыв из этого цикла на \r
в дополнение к \n
. Как я могу проверить любой из них, учитывая, что у меня есть только одна возможность вырваться из цикла? Моя цель - иметь возможность эмулировать switch
, вложенные if
с или if/else if
с.