Ваша задача - минимизировать код Brainfuck в соответствии с этими правилами:
- Удалите все, что не является одним из
+-><[].,
. - Для любой группы подряд
+
или-
символов, если сумма+
s и-
s одинаково, удалите их. - Сделайте то же, что и выше, но с
>
и<
. - Удалить последовательности
+-><
символов, если они ничего не делают. Например, вы должны удалить+>-<->+<
. (Это может быть самым сложным и сложным для реализации.) Убедитесь, что вы не получите никаких ложных срабатываний, например+>-<+>-<
, которые не должны быть удалены.
Тестовые случаи:
вход
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Выход
++++++[->++++++<]>.[-],[>,]<[.<]
вход
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Выход
+++>-<+>---<
Вы можете принимать ввод и вывод, как вам угодно - stdin / stdout, функция и т. Д., Но ввод может быть не закодирован.
Это код-гольф , поэтому победит самый короткий код в количестве символов.
+++>-<+>---<
? Его можно сократить, чтобы избежать ненужного перемещения указателя, но ожидаемый результат оставляет его неизменным. Мое понимание, основанное на рассмотрении как вопроса, так и ответов, заключается в том, что дверная ручка хороша, если спецификация принимается свободно; мы должны исключить любые непрерывные неактивные +-><
последовательности, как указано явным образом, кроме того, разрешено выполнять дополнительное минимизацию, как в вашем примере ++>>++<<--
, и мы также можем выполнять перестановки, если они не изменяют функциональность кода, например, >+<+
в +>+<
,
+>-<->+<
. (Это может быть самым сложным и сложным для реализации.) Убедитесь, что вы не получаете ложных срабатываний, например +>-<+>-<
, который не должен быть удален ". - это немного расплывчато
++>>++<<--
должен выводить>>++<<
, и это не было покрыто. Пожалуйста, добавьте больше тестовых случаев.