Может кто-нибудь, пожалуйста, объясните мне этот код? Я понимаю, что он делает, но я не понимаю, как это работает.Алгоритм Divmod в brainfuck
# >n 0 d
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]
# >0 n d-n%d n%d n/d
Может кто-нибудь, пожалуйста, объясните мне этот код? Я понимаю, что он делает, но я не понимаю, как это работает.Алгоритм Divmod в brainfuck
# >n 0 d
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]
# >0 n d-n%d n%d n/d
Вот что происходит:
# >n 0 d
Эта линия является строка комментария говорю вам, что память должна быть, как перед операцией. Дивиденд как n
, делитель как d
. Согласно коду, следующие 3 ячейки также должны быть пустыми, но здесь они игнорируются, если по умолчанию у вас пусто.
Для облегчения понимания, я буду теперь использовать 25/4 в качестве примера:
ptr 000 001 002 003 004 005 006
val 025 000 004 000 000 000 000
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]
Эта линия может быть разбита на части для облегчения наблюдения, но если вы просто используя его, это волшебная петля:
[->+>-
Эта часть минусов дивиденды, добавляет его на следующую ячейку для сохранения и минусы делитель. Память сейчас:
ptr 000 001 002 003 004 005 006
val 024 001 003 000 000 000 000
[>+>>]
Это добавляет извлеченный один из делителя, для сохранения вновь, так как нам это нужно, чтобы петля назад.
ptr 000 001 002 003 004 005 006
val 024 001 003 001 000 000 000
Затем он перемещается 2 шага вправо к ячейке 005
, то 006
из-за >
между ними, пропуская [+[-<+>]>+>>]
, так как ячейка пуста, а затем обратно в ячейку 000 из-за этой линии:
<<<<<<
Дополнительное движение важно, потому что для того, чтобы система не зацикливалась назад, нам нужно перейти в пустое пространство. переход на 006
в основном из-за дополнительного >
, который требуется для последующего использования.
Давайте пропустить некоторые шаги, и двигаться вперед, пока не станет делителем 0.
ptr 000 001 002 003 004 005 006
val 021 004 000 003 000 000 000
Он пропускает [>+>>]
поскольку ячейка 2 пуста сейчас, а затем она перемещается в ячейку 003
.
[+[-<+>]>+>>]
С 003
имеет значение, он должен запустить эту линию. добавляя его к значению, чтобы сделать его полным циклом, затем сдвиньте значение до 002
с помощью [-<+>]
. Указатель заканчивается на 003
, поэтому он перемещается в 004
и добавляет значение на единицу, чтобы указать полный цикл и, следовательно, еще один для частного. Он перемещается в 006
и обратно в 000
.
Повторите все это, то мы получим:
ptr 000 001 002 003 004 005 006
val 000 025 003 001 006 000 000
которая подобна последней строке
# >0 n d-n%d n%d n/d
как петля заканчивается, потому что 000
теперь пуст. n теперь полностью сдвинуто на 001
, 002
и 003
показывает цикл цикла делителя, когда n полностью обнулено. 004
показывает полную завершенную итерацию цикла делителя.