2016-07-31 4 views
5

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

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

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


Теперь, если (по какой причине) я хочу вырезать символы в нижнем регистре, это будет выглядеть так в psuedo 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 
<[<] 

Теперь мой вопрос, как я могу реализовать такой-то время цикла, а только с помощью пробелов справа 512 для хранения и очистки их позже. Для любопытных this проблема, которую я хочу решить в branf ***.

ответ

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 не некоторые произвольные, ни -zero value (иначе вы бы его использовали). Эта реализация была бы относительной - связанный список, но обратите внимание, что это будет место и код дорогой.


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

Смежные вопросы