Эффективная реализация цикла while в brainfuck

У меня возникли проблемы с реализацией ассемблера brainfuck для codegolf.se. Мне удалось загрузить строку в память, найти ее длину, вывести ее, напечатать строки n раз и т. Д., Но я не могу загрузить в память только строчные цифры. Итак, давайте возьмем следующий цикл, который выполняет некоторое волшебство. (Хеш-метки являются маркерами отладки.)

#,#[>#<[<]<<#+#>>>[>]#,#]<[<] 

Он начинается с указателя 512 и записывает строку как значения ascii в пятна после 512


Теперь, если (по какой-либо причине) я хочу вырезать строчные буквы, это будет выглядеть так в псевдо BF.

#,#[>#<[<]<<#+#>>>[>]#do{,(takes input and assigns it)}
while(input>=96/*Go arbitrarily to the right for this implementation but
make sure that the first non-lowercase number is stored at the index*/)#
//Also be sure to zero out any temporary cells used
<[<] 

Теперь мой вопрос: как мне реализовать такой цикл while, используя только пробелы справа от 512 в качестве хранилища И убирая их позже.

Для тех, кому интересно, это проблема, которую я хочу решить в Branfuck.

1 ответ

Решение

Ваш код может быть упрощен до

,[[<]<+>>[>],]<[<]

(<<+>> вероятно, результат использования онлайн-компилятора, который забывает ячейку 255)

и повторяется, чтобы произвести операцию вывода:

>.[[<]<->>[>]<.>]<[<]

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

[..., 104, 5, x, x, x, x, 108, 3, x, x, 102, 2...] 

[...,  104 ,    5   , x, x, x, x,  108 ,    3    , x, x,  102 ,    2   ...] 
      data   pointer              data   pointer         data   pointer

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


Обнуление ячеек или, как вы это называете, очистку их можно выполнить так же, как [<] - используя [-], это будет уменьшать значение ячейки до тех пор, пока оно не достигнет 0, а затем отключится. Вы можете перебирать строку вниз, когда вы находитесь в ее конце - и возвращаться, пока чистите каждую ячейку, пока не дойдете до начала (0 или другой зарезервированный вами номер).

Другие вопросы по тегам