我想应该是最短的,虽然完全没压。
有了Ruby的“正则”表达式,只要把语法写出来,调用几下就做完了。就是这方法的效率其实很低,因为这只是个“正则”表达式,显然没有提供解析到子表达式时的回调,每个子表达式都只能重新解析。甚至于前面的数字也不能直接捕获,否则会被子表达式的捕获所覆盖。
grammer = /(\[(\d+(?:[[:alpha:]]|\g<1>)*)\])/
expand = -> text {
text.gsub(grammer) {
n = $2[/\d+/].to_i
expand[$'] * n
}
}
puts expand[gets]