Как переместить указатель на произвольную сумму в BrainFuck? - PullRequest
2 голосов
/ 10 июня 2011

Например, если массив похож на 0 0 0 0 ... 0 0[n]s o m e d a t a 4 9 9 9 9 9 9 8 3 7 ..., как переместить указатель на n без изменения s o m e d a t a 4 9 9 9 ... после перемещения указателя?

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

Хороший вызов.Мне нравится этот язык:)

Мое решение (я думаю) несколько правильное, оно перемещает курсор после данных длины n без его изменения, , но оно перемещает данные на две ячейки вслева (или один, если соблюдены определенные условия).Вот код, надеюсь, вы найдете его полезным.

Требования:

  • слева от данных есть пустая ячейка и
  • указатель указывает на эту пустую ячейку и
  • в самих данных нет пустых ячеек.

Вот код:

>[<->+]<[>>[-<+>]<<[->>+<<]>[-<+>]<-]

Пример : массив 7 9 6, поэтому 3 сообщает, как далеко переместить курсор.

0 3 7 9 6 ?   this line represents data; values are numbers in cells
^             this shows the pointer location

>[<->+]< gives

3 0 7 9 6 ?
^

now the loop; while the pointer is not zero
[

>>[-<+>] gives in first iteration
3 7 0 9 6 ?
    ^

<<[->>+<<] gives in first iteration
0 7 3 9 6 ?
^

>[-<+>] gives in first iteration
7 0 3 9 6 ?
  ^

>[-<+>] gives in first iteration
7 3 0 9 6 ?
    ^

<- decreases the loop pointer and gives in first iteration
7 2 0 9 6 ?
  ^

which means the loop can continue giving
7 2 9 0 6 ?
7 0 9 2 6 ?
7 9 0 2 6 ?
7 9 2 0 6 ?
7 9 1 0 6 ? after the second iteration and finally
    ^
7 9 6 0 0 ? after the last
      ^
] which is where the loop will end

Теперь, , если есть дополнительная пустая ячейка слева от всей последовательности, тогда мы можем переместить данные на одну ячейку вправо.

0 7 9 6 0 0 ?
        ^

<[[>+<-]<] gives
0 0 7 9 6 0 ?
^

>>[>] gives finally
0 0 7 9 6 0 ?
          ^

Таким образом, курсор перемещается за данными произвольной длины,однако смещение данных на одну ячейку влево.

Отказ от ответственности В коде могут быть ошибки, но сама идея должна быть ясной.Не стесняйтесь исправлять код всякий раз, когда он не соответствует примеру.

1 голос
/ 12 августа 2011

Это может быть слишком очевидно, но вы можете переместить указатель на следующий ноль с помощью [>] или [<].Таким образом, вы можете добавить 1 к вашим ячейкам данных (упаковка peano) и вычесть 1 перед выводом ([-.>])?

К сожалению, это может не дать достаточно точного контроля.

...