收集垃圾


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我不明白任务是什么。当然,这可能是因为我累了,但是当前的措辞没有多大意义
Blue

1
基本上,对于括号内但不在括号内的每个子字符串,请将其向左移动,直到也位于括号内。

因为这个问题不断地被关闭和重新打开,所以我在理解问题的基础上进行了编辑。希望我在这个过程中没有改变问题。

@ ais523我很好。非常感谢您所做的所有编辑。
伊万·德拉诺

Answers:


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 将垃圾桶与嵌套的垃圾袋匹配,但是我认为如果需要的话,它不能检查垃圾袋内的平衡支架。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.