IMP:隐式乘法解析器


9

杰克喜欢C编程语言,但不喜欢写表达式,例如V=a*b*h; 将值相乘。

他想改写V=abh;,为什么编译器抱怨abhint a, b, h;定义后就没有定义符号,所以我们可以得出乘法呢?

如果已知当前作用域中定义的变量集,请帮助他实现一个解析器,该解析器可解密单个乘法项。

为简单起见,2*a*b不考虑乘以数字(如中的),仅显示变量。

输入是一个乘法项T,满足正则表达式:

[a-zA-Z_][a-zA-Z_0-9]*

和可变组Z

变量集Z上的项T的解析P是满足以下条件的字符串:

  1. *从P中删除所有出现的项后,我们收到T,
  2. 要么是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

输入(变量列表和术语)可以以适合该语言的任何方式提供。

输出可以采用任何合理的形式(每行一次解析或以逗号分隔的列表等)-但输出应该明确并且可以读取。

如果没有可能的术语解析(在示例中,为清楚起见,我使用“-”),则可以使用空输出。

这是一场代码高尔夫,所以最短的代码获胜。


1
在您的第一个示例中,我认为这ab*c是不正确的解析,因为c这不是允许的变量。
isaacg 2015年

1
通过递归扫描,我可以在样本中准确找到您的结果。但这是有问题的:为什么a*aaa aaa*a而不是ab*c c*ab
edc65

由于解析规则1。是的,乘法通常是可交换的,但是到目前为止我们还不走,我们只是想按完成的顺序“重构”乘法。实际上,以杰克的语言来说,我们可以有一个矩阵类型-乘法不是可交换的。“ aaaa”既可以与“ aaa”和“ a”并置,也可以与“ a”和“ aaa”并列-这不是为了交换,而是出于模棱两可的考虑。
pawel.boczarski 2015年

Answers:


4

Pyth,18个字符

mj\*dfqzsTsm^Qkhlz

该解决方案改编自我的《解释鱼》 解决方案。这些问题实际上非常相似。

期望这样输入:

aaaa
"a", "aaa"

给出这样的输出:

['a*aaa', 'aaa*a', 'a*a*a*a']

在这里尝试。

  • sm^Qkhlz:生成所有变量序列,这些序列最多包含输入字符串数量的变量的长度。

  • fqzsT:筛选出与输入字符串匹配的变量序列

  • mj\*d:插入*符号并打印。


3

Python 2-147 94字节


R=lambda S,V,F=[]:S and[R(S[len(v):],V,F+[v])for v in V if v==S[:len(v)]]or print("*".join(F))

这定义了R要使用的功能,例如:

>>> R("abc", ["a", "bc", "ab", "c"])

打印输出,如:

a*bc
ab*c

1

JavaScript(ES6)111

根据我的“鱼”答案改编而成,主要区别是找到所有解决方案,而不仅仅是第一个。

F=(v,t)=>(k=(s,r)=>s?v.map(v=>s.slice(0,l=v.length)==v&&k(s.slice(l),[...r,v])):console.log(r.join('*')))(t,[])

输出将打印到控制台。函数结果没有意义,必须将其丢弃。

在Firefox / FireBug控制台中测试

F(['a','c','ab','bc'],'abc')  
a*bc  
ab*c

F(['ab','bc'],'abc')

F(['aaa','a'],'aaaa')
aaa*a
a*aaa
a*a*a*a

F(['xyz'],'xyz')
xyz
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.