杰克喜欢C编程语言,但不喜欢写表达式,例如V=a*b*h;
将值相乘。
他想改写V=abh;
,为什么编译器抱怨abh
自int a, b, h;
定义后就没有定义符号,所以我们可以得出乘法呢?
如果已知当前作用域中定义的变量集,请帮助他实现一个解析器,该解析器可解密单个乘法项。
为简单起见,2*a*b
不考虑乘以数字(如中的),仅显示变量。
输入是一个乘法项T,满足正则表达式:
[a-zA-Z_][a-zA-Z_0-9]*
和可变组Z。
变量集Z上的项T的解析P是满足以下条件的字符串:
*
从P中删除所有出现的项后,我们收到T,- 要么是Z中的变量名,要么由Z中的适当变量名组成,并用单个
*
字符分隔。
解决方案应打印术语的所有分析。
样品:
Vars a, c, ab, bc
Term abc
Solution ab*c, a*bc
Vars ab, bc
Term abc
Solution -
Vars -
Term xyz
Solution -
Vars xyz
Term xyz
Solution xyz
Vars width, height
Term widthheight
Solution width*height
Vars width, height
Term widthheightdepth
Solution -
Vars aaa, a
Term aaaa
Solution aaa*a, a*aaa, a*a*a*a
输入(变量列表和术语)可以以适合该语言的任何方式提供。
输出可以采用任何合理的形式(每行一次解析或以逗号分隔的列表等)-但输出应该明确并且可以读取。
如果没有可能的术语解析(在示例中,为清楚起见,我使用“-”),则可以使用空输出。
这是一场代码高尔夫,所以最短的代码获胜。
通过递归扫描,我可以在样本中准确找到您的结果。但这是有问题的:为什么
—
edc65
a*aaa aaa*a
而不是ab*c c*ab
由于解析规则1。是的,乘法通常是可交换的,但是到目前为止我们还不走,我们只是想按完成的顺序“重构”乘法。实际上,以杰克的语言来说,我们可以有一个矩阵类型-乘法不是可交换的。“ aaaa”既可以与“ aaa”和“ a”并置,也可以与“ a”和“ aaa”并列-这不是为了交换,而是出于模棱两可的考虑。
—
pawel.boczarski 2015年
ab*c
是不正确的解析,因为c
这不是允许的变量。