Бесконечный цикл подсчета в Brainfuck

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

+[[>+]+]

С однобайтовыми ячейками с переносом и с 30 КБ ячеек с циклическим переносом это создает бесконечный цикл подсчета. Он устанавливает каждую ячейку в 1, затем каждую ячейку в 2 и т. Д.

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

Счетчик для каждой ячейки идет 0 -> 1 -> 2 ... 254 -> 255 -> 1 ...

Пока хотелось бы пойти 0 -> 1 -> 2 ... 254 -> 255 -> 0 -> 1 ...

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

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


person bgrag    schedule 07.09.2011    source источник


Ответы (2)


Пытаться:

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

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

person captncraig    schedule 07.09.2011
comment
К сожалению, это увеличивает длину вашей программы примерно на 62% и гораздо менее элегантно, но работает. Я не уверен, что нет более короткого пути, но это, наверное, наиболее очевидный. - person captncraig; 08.09.2011

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

-[[-]>-]

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

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

person captncraig    schedule 08.09.2011