쓰레기를 모 으세요 현재 쓰레기통 안에 있지 않은 각 쓰레기

애비뉴를보고 있는데 누군가 쓰레기를 버렸습니다! 휴지통을 휴지통에 넣어 문제를 해결하는 데 도움이되는 프로그램을 작성해야합니다.

작업

애비뉴는 인쇄 가능한 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



답변

자바 스크립트 (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 휴지통에 중첩 된 쓰레기 봉투와 일치하지만 필요한 경우 쓰레기 봉투 안의 균형 잡힌 브래킷을 확인할 수 있다고 생각하지 않습니다.


답변