- 23, Oct 2024
- #1
Вы смотрите на проспект, а кто-то выбросил мусор! Вам нужно написать программу, которая поможет решить проблему, выбрасывая мусор в мусорные баки.
Задача
Проспект состоит из строки печатаемых символов ASCII, например:
[(unusable)(filthy)]] door car
Некоторые из скобок здесь не имеют себе равных; это просто приманки. Что нас волнует, так это подобранные наборы кронштейнов.
А мусорное ведро это строка, начинающаяся с []] (unusable) door (filthy) car
and ending with [[](dust)[]((paper)vomit)(broken(glass))] car [[(rotten)(dirty)] fence
, а также с внутренними совпадающими скобками и круглыми скобками. Например, [[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)
and (bag1)
— это мусорные баки в приведенной выше строке.
А мешок для мусора это строка, начинающаяся с (bag2)
and ending with [can(bag1)(bag2)]
, а также с внутренними совпадающими скобками и круглыми скобками. Например, [can](bag1)(bag2)
is a trash bag in the above string.
Возможно, некоторые мешки для мусора уже лежат в мусорных баках. Однако по крайней мере один останется без внимания, и нам нужно переместить мешки для мусора так, чтобы они все оказались в мусорных баках. В частности, для каждого мешка для мусора, который в данный момент не находится внутри мусорного бака (т. е. подстроки этого мусорного бака), нам нужно удалить его из текущего местоположения в строке и вместо этого вставить его в место внутри мусорного бака. .
Здесь есть дополнительное правило. Поскольку мы не хотим тратить слишком много денег на сборщиков мусора, а их маршрут проходит по проспекту справа налево, мы хотим переместить каждый мешок для мусора. Слева (самый важный критерий, если предположить, что нам вообще придется его переместить) и максимально короткое расстояние (пока он сдвинут влево). Так, например, единственный правильный вывод для
[can1(bag)][can2]
является
[can1](bag)[can2]
(перемещая сумку всего на один символ влево). Кроме того, сумки должны оставаться в том же относительном порядке:
(dust)
должен стать
)
(т.е. вы не можете поставить (
to the left of [[](dust)[]]
.)
Разъяснения
- Слева от крайнего левого мусорного бака не будет мешков для мусора; всегда можно будет собрать весь мусор, переместив его влево.
- Всегда будет хотя бы одна сумка, которую нужно перевезти. Их может быть больше одного.
- Внутри мешка для мусора никогда не будет мусорного бака (контейнеры слишком ценны, чтобы их просто выбрасывать).
- Если пакет уже находится внутри банки, просто оставьте его в покое.
- Это нормально, если ввод и вывод различаются конечными пробелами (включая символы новой строки).
Примеры:
Вход:
[]
Выход:
]
Вход:
[
Выход :
[[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)
#код-гольф #сбалансированная струна