Codegolf - Собери Мусор

  • Автор темы GVADRIAN
  • Обновлено
  • 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)

#код-гольф #сбалансированная струна

GVADRIAN


Рег
09 Apr, 2011

Тем
63

Постов
230

Баллов
555
  • 26, Oct 2024
  • #2

JavaScript (ES6), 263 228 209 205 184 177 173 162 байта

Любая помощь с кодом/регулярными выражениями приветствуется.

 /\[\[][\w()]*\[]]|\[]/g 

Анонимная функция; занимает один s parameter, String и возвращает результат.

f=s=>s.match(t=/\[\[][\w()]*\[]]|\[]/g,g=/\([\w()]*\)/g,i=0,u=s.split(t).filter(e=>e)).map(e=>e.substr(0,e.length-1)+u[i].match(g).join``+`]`+u[i++].replace(g,``)).join`` matches trash cans with nested trash bags, however I don't think it could check balanced brackets within trash bags if needed.

 

Goliy.muzhik


Рег
30 Nov, 2019

Тем
84

Постов
214

Баллов
654
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно