Для непосвященных, 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
от BASIC. Следующее будет вызывать getchar ()
, пока не вернется 0
:
, # *ptr = getchar();
[ # while (*ptr) {
>, # *(++ptr) = getchar();
] # }
Но что если я захочу прочитать только символ новой строки \ n
? После некоторых трудностей, связанных с тем, как это можно приспособить для простой работы , если
я придумал следующее:
, # *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
. Как я могу проверить любой из них, учитывая, что у меня есть только одна возможность вырваться из цикла? Моя цель - иметь возможность эмулировать переключатель
, вложенный , если
с или , если / еще, если
с.
Я еще не посмотрел ссылку, но полагаю, что ответ AShelly, вероятно, более универсально полезен... однако, не решившись позволить своим пальцам напечатать какой-нибудь Brainfuck раньше, я решил, что сейчас самое подходящее время, и смог получить следующее, что я думаю работает.
Вторая половина предназначена только для распечатки того, что было захвачено первой частью. Также, не буду врать, мой мозг действительно чувствует себя основательно "трахнутым" после попытки разобраться с этим... Очень метко названный язык, хех.
+
[
>,
----------
[
---
[
+++++++++++++
>>
]
]
<
[
>>
]
<
]
++++++++++++
[
<
]
>
[
.>
]
Здесь представлены алгоритмы для выполнения базовой ЛОГИЧЕСКОЙ, но сложной операции для Brain F * ck :)
См. на этой странице описание того, как начать с единственной управляющей структуры BF и определить серию все более сложных последовательностей, представляющих более сложные операции.