Зберіть сміття


9

Ти дивишся на проспект, а хтось покинув сміття! Потрібно написати програму, яка допоможе виправити проблему, помістивши сміття в кошики для сміття.

Завдання

Проспект складається з рядка символів для друку ASCII, наприклад:

[[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

Деякі з дужок тут не мають собі рівних; це просто приманки. Що нас хвилює - це відповідні набори дужок.

Сміттєвий бак представляє собою рядок , починаючи з [і закінчуючи ], і внутрішньо узгоджених дужок і дужок. Наприклад, []і [[](dust)[]]є кошики для сміття у наведеному вище рядку.

Мішок для сміття є рядком , починаючи з (і закінчуючи ), і внутрішньо узгоджені дужками і дужками. Наприклад, (dust)чи є мішок для сміття у наведеній вище рядку.

Можливо, деякі сумки для сміття вже є у сміттєвих кошиках. Однак принаймні один залишився, і нам потрібно перемістити мішки для сміття, щоб вони були всередині сміттєвих баків. Зокрема, для кожного мішка для сміття, який наразі не знаходиться у кошику для сміття (тобто підрядка цього сміттєвого кошика), нам потрібно видалити його з поточного місця в рядку та вставити його в місце, яке знаходиться всередині сміттєвого бака .

Тут є додаткове правило. Оскільки ми не хочемо витрачати занадто багато грошей на сміттєзбірники, а їх маршрут веде їх по проспекту справа наліво, ми хочемо перемістити кожен мішок з сміттям вліво (найважливіший критерій, якщо припустити, що ми повинні перенести його на все) і найкоротшу можливу відстань (доки вона рухається ліворуч). Так, наприклад, єдиний правильний вихід для

[can1](bag)[can2]

є

[can1(bag)][can2]

(переміщення сумки лише на один символ вліво). Крім того, сумки повинні залишатися в тому ж відносному порядку:

[can](bag1)(bag2)

має стати

[can(bag1)(bag2)]

(тобто ви не можете поставити (bag2)ліворуч від (bag1).)

Роз'яснення

  • Зліва від крайнього лівого смітника не буде жодних мішків для сміття; завжди можна буде виправити все сміття, перемістивши його вліво.
  • Завжди буде хоч один мішок для переміщення. Можливо, їх буде більше.
  • Всередині мішка для сміття ніколи не буде сміття (банки занадто цінні, щоб їх просто викинути).
  • Якщо пакетик вже знаходиться в банці, просто залиште його в спокої.
  • Гаразд, щоб вхід і вихід відрізнялися у пробілі пробілу (включаючи нові рядки).

Приклади:

  • Вхід: [[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

    Вихід: [[](dust)[]((paper)vomit)(broken(glass))] car [[(rotten)(dirty)] fence

  • Вхід: []] (unusable) door (filthy) car

    Вихід: [(unusable)(filthy)]] door car


5
Близькі виборці, чи могли б ви пояснити, що ви вважаєте незрозумілим? Повідомлення буде важко виправити без явного керівництва щодо того, що з цим не так.

@ ais523 Я не можу зрозуміти, що це за завдання. Зрозуміло, що це може бути тому, що я втомився, але теперішня редакція не має особливого сенсу
Блакитний

1
По суті, для кожної підрядки, яка знаходиться в круглих дужках, але не знаходиться в дужках, переміщуйте її ліворуч, поки вона також не знаходиться в дужках.

Оскільки ця проблема неодноразово закривається та відновлюється, я редагував її, розуміючи проблему. Сподіваюся, я не змінив проблему в процесі.

@ ais523 Це добре мені. Дуже дякую за все редагування.
Еван Деланой

Відповіді:


3

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

Будемо дуже вдячні за будь-яку допомогу щодо коду / регулярних виразів.

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``

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

/\[\[][\w()]*\[]]|\[]/g співпадає з кошиками для сміття з вкладеними мішками для сміття, однак я не думаю, що він міг би перевірити збалансовані дужки в мішках для сміття, якщо це потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.