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