受xkcd漫画启发,我们已经遇到了meta-regex-golf问题
但是,这个正则表达式高尔夫看起来也很有趣!我想区分美国各州和意大利各地区。为什么?我是这两个国家的公民,我总是有这样的烦恼*。
意大利的地区是
Abruzzo, Valle d'Aosta, Puglia, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Sardegna, Sicilia, Trentino-Alto Adige/Südtirol, Toscana, Umbria, Veneto
美国的州是
Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin, Wyoming
您的工作是编写一个程序,以正则表达式区分这些列表。这是一个新游戏,所以这是
规则
- 必须使用单个匹配的正则表达式来区分列表。
- 您的分数就是该正则表达式的长度,越小越好。
需要明确的是:所有工作都必须由正则表达式完成-不过滤,不替换,不做任何事情,即使这些也使用正则表达式完成。也就是说,应将输入直接传递给正则表达式,并且以后的代码部分只能使用二进制答案(匹配/不匹配)。除匹配表达式外,切勿检查或更改输入。 例外:吃与Ruby类似的换行符chomp
就可以了。
您的程序应从stdin的任一列表中获取一个条目(可选的后跟\n
或者EOF
如果要使事情变得更容易),并打印以输出该列表的名称。在这种情况下,我们的列表命名为Italy
和USA
。
要测试您的代码,只需运行两个列表即可。对于列表中未出现的字符串,行为可能未定义。
计分问题
这可能必须在每种语言的基础上完成。在Perl中
m/foobarbaz/
是匹配的正则表达式。但是,在Python中,
import re
re.compile('foobarbaz')
做同样的事情。我们不计算Python的引号,所以我说我们不计算Perl中的the m/
和final /
。在以上两种语言中,上述各项均应获得9分。
为了澄清Abhijit提出的观点,即使您动态生成匹配表达式,它的实际长度也是分数。例如,如果您发现了一个神奇的表情m
,
n="foo(bar|baz)"
m=n+n
那么您不应报告分数为12:m
长度为24。并且需要特别清楚的是,生成的正则表达式不能依赖于输入。那将是在将输入传递到正则表达式之前读取输入。
范例会话
input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy
*实际上,这是一个谎言。我从来没有遇到任何麻烦。
USA
如果有这样的字符串,它允许一个人返回,因此您只需要检查意大利语区域,USA
否则返回。