视网膜,53 43 42 41 40 35字节
^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2
为了进行计数,每一行都在一个单独的文件中,但是您可以通过使用带有-s
标志的Retina将上述作为单个文件运行。
这期望输入字符串中的数字以一元形式给出,并以相同的格式输出。例如
1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111
代替
1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4
说明
该代码描述了一个正则表达式替换,基本上是将4个替换压缩为一个。请注意,只有一个分支会填充组,$2
因此如果其他三个分支中的任何一个匹配,则该匹配将从字符串中删除。因此,我们可以分别查看四种不同的情况:
^[^x]+<space>
<empty>
如果可以从字符串的开头到达空格而不会遇到x
,则表示第一个术语是常数术语,我们将其删除。由于的贪婪性+
,这也将匹配常数项后的加号和第二个空格。如果没有常数项,则此部分将永远不会匹配。
x(?= )
<empty>
这与an匹配x
,后跟一个空格,即x
线性项的(如果存在),并将其删除。我们可以确定在它后面有一个空格,因为多项式的次数总是至少为2。
1(?=1*x.(1+))
$1
这将系数与指数相乘。这与1
系数中的一个匹配,并通过前瞻将其替换为整个对应的指数。
(\^1)?1(?= |$)
<empty>
通过匹配尾随1
(由超前确保),可以减少所有剩余的指数。如果有可能匹配^11
(和单词边界),我们将其删除,以确保正确显示线性项。
对于压缩,我们注意到大多数情况不会相互影响。(\^1)?
如果在第三种情况下的前瞻性是正确的,则不会匹配,因此我们可以将这两个条件放在一起作为
(\^1)?1(?=1*x.(1+)| |$)
$2
现在我们已经有了第二种情况所需的前瞻性,并且其他情况在匹配时永远都不可能成立x
,因此我们可以简单地1
将a 推广为\w
:
(\^1)?\w(?=1*x.(1+)| |$)
$2
第一种情况实际上与其他情况没有任何共同之处,因此我们将其分开。