Ваша задача - минимизировать код Brainfuck в соответствии с этими правилами:
- Удалите все, что не является одним из
+-><[].,
. - Для любой группы подряд
+
или-
символов, если сумма+
s и-
s одинаково, удалите их. - Сделайте то же, что и выше, но с
>
и<
. - Удалить последовательности
+-><
символов, если они ничего не делают. Например, вы должны удалить+>-<->+<
. (Это может быть самым сложным и сложным для реализации.) Убедитесь, что вы не получите никаких ложных срабатываний, например+>-<+>-<
, которые не должны быть удалены.
Тестовые случаи:
вход
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Выход
++++++[->++++++<]>.[-],[>,]<[.<]
вход
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Выход
+++>-<+>---<
Вы можете принимать ввод и вывод, как вам угодно - stdin / stdout, функция и т. Д., Но ввод может быть не закодирован.
Это код-гольф , поэтому победит самый короткий код в количестве символов.
++>>++<<--
должен выводить>>++<<
, и это не было покрыто. Пожалуйста, добавьте больше тестовых случаев.+++>-<+>---<
? Его можно сократить, чтобы избежать ненужного перемещения указателя, но ожидаемый результат оставляет его неизменным. Мое понимание, основанное на рассмотрении как вопроса, так и ответов, заключается в том, что дверная ручка хороша, если спецификация принимается свободно; мы должны исключить любые непрерывные неактивные+-><
последовательности, как указано явным образом, кроме того, разрешено выполнять дополнительное минимизацию, как в вашем примере++>>++<<--
, и мы также можем выполнять перестановки, если они не изменяют функциональность кода, например,>+<+
в+>+<
,+>-<->+<
. (Это может быть самым сложным и сложным для реализации.) Убедитесь, что вы не получаете ложных срабатываний, например+>-<+>-<
, который не должен быть удален ". - это немного расплывчатоОтветы:
REBEL - 104
Использование:
Ввод: читает одну строку из стандартного ввода.
Вывод: печатает одну строку в стандартный вывод.
Аномалии *:
_
приводит к прочтению и использованию другой строки, а не к выводу ничего.++++>----<
вместо+++>-<+>---<
. Но это нормально, верно? ;)>-<+
и т. д. заменены на+>-<
и т. д.Спойлер:
* Это не ошибка, это особенность!
источник
Brainfuck, 579 байтов
С форматированием и некоторыми комментариями:
Это использует тот же подход, что и решение Кейта Рэндалла, минимизируя все смежные последовательности
+-<>
оптимально путем симуляции. Например,+++>-<+>---<
становится++++>----<
и>+<+<<+>+<->>>>
становится+<+>>+>
.Попробуйте онлайн. (Если абсолютное значение моделируемой ячейки приближается к 256, возникнут проблемы переполнения.)
Общая структура
Лента разделена на 7-элементные узлы; в начале внутреннего цикла макет памяти
0 s 0 c 0 a b
где
s
- логический флаг для начальной ячейки,c
текущий символ,a
отрицательная часть значения моделируемой ячейки (плюс один), иb
положительная часть имитируемого значения ячейки.Когда минимизированная последовательность печатается, макет памяти
d n e 0 0 a b
где
d
это логический флаг для направления,a
иb
это , как и раньше (но становится одним / ноля при печати), а такжеn
иe
только отлична от нуля для конечного узла;n
связано с тем, сколько раз узел был замечен, иe
является значением символа, который остановил внутренний цикл (плюс один).Первоначально я рассматривал отслеживание большего количества информации на узел: самый левый и самый правый узел в виде логических флагов, а также положение узла по отношению к начальному и конечному узлам. Но мы можем избежать этого, просматривая соседние ячейки, когда это необходимо, и сканируя влево и вправо, чтобы найти начальный узел.
При печати минимизированной последовательности и принятии решения о том, как перемещать симулируемый указатель, мы можем выбрать общий подход: начать с удаления от конечного узла (в произвольном направлении, если начальный и конечный узлы совпадают), развернуться в крайнем левом и правом краях узлы и остановка в зависимости от того, сколько раз был замечен конечный узел: 3 раза, если начальный и конечный узлы совпадают, в противном случае 2.
источник
Питон, 404 символа
Этот код делает идеальную оптимизацию всех подпоследовательностей
+-<>
. Чуть больше, чем вы просили, но вы идете.Он работает путем имитации
+-<>
операций на лентеt
.s
это начальная позиция на ленте иp
текущая позиция. После моделирования он вычисляет степень, с[a,b]
которой необходимо работать, и выполняет все +/- за один оптимальный проход.источник
CoffeeScript -
403397Демо (пожалуйста, прости использование bit.ly здесь, весь URL сломал бы уценку)
Несжатая версия (с отладочным кодом):
источник
>+.-<
, производя пустую строку вместо того, чтобы оставить это неизменным.