ゴミを集める


9

あなたは通りを見ていて、誰かがゴミを残しました!ゴミ箱にゴミ箱を置くことによって、問題を解決するのを助けるプログラムを書く必要があります。

タスク

アベニューは、印刷可能なASCII文字列で構成されています。例:

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

ここにあるブラケットのいくつかは、他に類を見ません。それらはおとりです。私たちが気にするのは、対応する括弧のセットです。

ゴミ箱は始まる文字列で、[で終わる]、そして内部で一致したブラケットと括弧で。例えば、[]および[[](dust)[]]上記の文字列でゴミ箱です。

ゴミ袋はで始まる文字列で、(で終わる)、そして内部で一致したブラケットと括弧で。たとえば(dust)、上の文字列のゴミ袋です。

ゴミ袋の一部がすでにゴミ箱に入っている可能性があります。ただし、少なくとも1つは除外されるため、ゴミ箱をすべてゴミ箱に入れるようにゴミ箱を移動する必要があります。具体的には、現在ゴミ箱の中にない各ゴミ袋(つまり、そのゴミ箱の部分文字列)について、それを文字列の現在の場所から削除し、代わりにゴミ箱の中にある場所に挿入する必要があります。 。

ここに追加のルールがあります。ガベージコレクターにあまりお金をかけたくないため、ガベージコレクターのルートは通りに沿って右から左に移動するので、各ゴミ袋を左に移動します(最も重要な基準は、すべて)および可能な最短距離(左に移動している限り)。したがって、たとえば、唯一の正しい出力

[can1](bag)[can2]

です

[can1(bag)][can2]

(バッグを1文字左に移動)。さらに、バッグは同じ相対的順序にとどまる必要があります。

[can](bag1)(bag2)

になる必要があります

[can(bag1)(bag2)]

(つまり(bag2)、の左側に置くことはできません(bag1)。)

明確化

  • 一番左のゴミ箱の左側にゴミ袋はありません。ゴミ箱を左に動かすと、いつでもゴミ箱をすべて開けます。
  • 移動するバッグは常に少なくとも1つあります。複数あるかもしれません。
  • ゴミ袋の中にゴミ箱は決してありません(缶は価値がありすぎて捨てることができません)。
  • バッグがすでに缶に入っている場合は、そのままにしておきます。
  • 入力と出力の末尾の空白(改行を含む)が異なっていても問題ありません。

例:

  • 入力: [[](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仕事がわからない。確かに私は疲れているのかもしれませんが、現在の表現はあまり意味がありません
Blue

1
基本的に、括弧内にあるが括弧内にない各部分文字列について、括弧内になるまで左に移動します。

この問題は繰り返し閉じられ、また開かれるため、問題を理解して編集しました。うまくいけば、私はプロセスの問題を変更していません。

@ ais523私はこれで結構です。ご編集ありがとうございました。
Ewan Delanoy、2016

回答:


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

匿名関数。1つのStringパラメータを取りs、出力を返します。

/\[\[][\w()]*\[]]|\[]/g ネストされたゴミ袋とゴミ箱を一致させますが、必要に応じてゴミ袋内のバランスの取れたブラケットをチェックできるとは思いません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.