Бесконечный счетный цикл в Brainfuck - PullRequest
6 голосов
/ 08 сентября 2011

В качестве программы отладки / тестирования для моей реализации brainf * ck я создал следующий цикл подсчета:

+[[>+]+]

При использовании однобайтовых ячеек обтекания и 30 000 ячеек с переносом это создает бесконечный цикл подсчета. Он устанавливает для каждой ячейки значение 1, затем для каждой ячейки значение 2 и т. Д.

Моя проблема в том, что когда он достигает 255, внутренний цикл увеличивает ячейку до 0, а затем внешний цикл немедленно увеличивает ее до 1. Это действует как «двойной шаг» при переполнении вместо одного шага. Это единственный способ заставить цикл продолжаться бесконечно с этим ограниченным количеством программ.

Количество для каждой ячейки равно 0 -> 1 -> 2 ... 254 -> 255 -> 1 ...

Пока я бы хотел, чтобы это пошло 0 -> 1 -> 2 ... 254 -> 255 -> 0 -> 1 ...

Просто трудно продолжить цикл, когда текущая ячейка равна нулю. Я играл с вариациями на одну и ту же тему, но ни один из них не понял правильно.

Эта конкретная программа - просто тривиальная программа подсчета для тестирования, но что действительно поможет мне с будущими программами, так это знание того, как инвертировать условные циклы, как мне нужно, чтобы этот цикл подсчета работал.

Ответы [ 2 ]

4 голосов
/ 08 сентября 2011

Попробуйте:

+[[>+]>[+>]+]

После первого внутреннего цикла мы знаем, что данные равны 0, за которыми следует группа из 255. Перейдите к следующей ячейке и увеличивайте их все, пока мы не вернемся к началу. Затем увеличьте первую ячейку и начните все сначала.

1 голос
/ 08 сентября 2011

Еще одна возможность, которую я рассмотрел вчера вечером, хотя она немного отличается от ваших требований:

-[[-]>-]

Это тот же размер, что и ваш оригинал, но он ведет обратный отсчет. Он циклически изменяет каждую ячейку от 255 до нуля, но изменяет только одну ячейку за раз. Я подумал, что добавлю это, поскольку это интересный короткий цикл, который вы можете использовать для тестирования.

Конечно, вы можете заставить любой из этих циклов считать или увеличивать счет, используя только + или только -.

...