我想尝试一种新型的regex高尔夫挑战赛,它要求您用正则表达式替代只解决简单的计算任务。为了使这一切成为可能,减少琐事,您将被允许应用多个替换,一个接一个。
挑战
我们将从简单开始:给定一个包含两个正整数的字符串,用用a分隔的十进制数表示,
,产生一个包含它们的总和的字符串,也用十进制数表示。所以,非常简单
47,987
应该变成
1034
您的答案应适用于任意正整数。
格式
每个答案应该是一系列替换步骤,每个步骤都由一个正则表达式和一个替换字符串组成。(可选)对于序列中的每个步骤,您可以选择重复替换,直到字符串停止更改。下面是一个例子提交(它不解决上述问题):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
给定输入123,456
,此提交将按如下方式处理输入:第一次替换将被应用一次并产生:
|123,|456
现在在循环中应用第二个替换,直到字符串停止更改为止:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
最后,第三次替换被应用一次:
111111
请注意,循环的终止条件是字符串是否更改,而不是正则表达式是否找到匹配项。(也就是说,如果找到匹配项,但替换项与匹配项相同,它也可能会终止。)
计分
您的主要分数将是您提交的替代步骤数。每次重复替换将计为10个步骤。因此,上面的示例将得分1 + 10 + 1 = 12
。
在平局(不太可能)的情况下,次要得分是所有步骤的总和。对于每个步骤,请添加正则表达式(不带分隔符),修饰符和替换字符串。对于上述示例,将为(6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
。
杂项规则
您可以使用任何正则表达式香料(应指出),但是所有步骤都必须使用相同的香料。此外,您不得使用调味剂的宿主语言的任何功能,例如替换回调或e
评估Perl代码的Perl 修饰符。所有操作必须仅通过正则表达式替换进行。
请注意,是否每次替换都替换所有匹配项还是仅替换单个匹配项,取决于您的口味和修饰符。例如,如果您选择ECMAScript风味,则默认情况下,除非使用g
修饰符,否则一步仅会替换一个实例。另一方面,如果您使用的是.NET风格,则每个步骤将始终替换所有出现的内容。
对于单次和全局替换具有不同替换方法的语言(例如Ruby's sub
vs. gsub
),请假定默认为单次替换,并将全局替换视为g
修饰符。
测试中
如果您选择的风格是.NET或ECMAScript,则可以使用Retina来测试提交(据说,它也可以在Mono上运行)。对于其他口味,您可能必须使用宿主语言编写一个小程序,该程序按顺序应用替换。如果这样做,请在答案中包含此测试程序。