正则表达式高尔夫:意大利对美国的地区


23

受xkcd漫画启发,我们已经遇到了meta-regex-golf问题

版权所有2013 Randall Munroe

但是,这个正则表达式高尔夫看起来也很有趣!我想区分美国各州和意大利各地区。为什么?我是这两个国家的公民,我总是有这样的烦恼*

意大利的地区是

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如果要使事情变得更容易),并打印以输出该列表的名称。在这种情况下,我们的列表命名为ItalyUSA

要测试您的代码,只需运行两个列表即可。对于列表中未出现的字符串,行为可能未定义。

计分问题

这可能必须在每种语言的基础上完成。在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

*实际上,这是一个谎言。我从来没有遇到任何麻烦。


您能解释一下“没有过滤,没有替换,什么都没有……即使这些也使用正则表达式完成了”的意思。只是要澄清一下,这是否意味着过滤,替换州/地区列表或焦点更广泛?
阿比吉特(Abhijit)2014年

@Abhijit编辑。这样清楚吗?

3
@ Eliseod'Annunzio:DC是不是一个状态
凯尔Kanos

1
“对于未出现在列表中的字符串,行为可能未定义。” 这条规则是无效的USA如果有这样的字符串,它允许一个人返回,因此您只需要检查意大利语区域,USA否则返回。
o0'。

1
@boothby好吧,不,这是一个简单的逻辑:它基本上只是要求一个正则表达式来匹配意大利地区,但是却用一种非常复杂的方式措辞了。由于这个错误,有关美国各州的全部要点与实际提出的问题完全无关。这也使问题变得不那么有趣了。
o0'。

Answers:


10

Perl- 51 36个字节(用于正则表达式)

print<>=~/.A|ise|net|te|z.o|[cp]a|[lr]ia|r[cd]/?"Italy
":"USA
"

没什么特别的,但是最好将其发布,因为它与其他51字节解决方案不同。

或者,将我已经很短的解决方案缩短15个字节。我认为,现在就赢了。


7

Perl,40个字符

从另一个方向进行处理,即与美国各州相匹配:

[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b

正则表达式中唯一的Perl / PCRE特定功能是\b单词边界锚,我用它代替$字符串末尾锚来匹配“南卡罗来纳州”。

这是Perl单行代码中的正则表达式,用于测试:

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'

这是一个更具考验性的测试工具:perl -pe'$ _ = / re /?“ USA \ n”:“ Italy \ n”'
别名2014年

3
@Pseudonym:嗯。只要不计入分数,不妨保持其可读性。
Ilmari Karonen 2014年

5

Ruby(正则表达式),44岁

$_ = gets.chomp
puts /'|-|(([^gn]i|gn|at)a|[hst]e|to|zo)$|To|La|pa/ ? "Italy" : "USA"

你知道吗?区分大小写是最佳的词首锚。

我不知道,但我觉得我欠paHax0r778的答案


3

Perl-51

(<STDIN> =~ m/'|-|ru|pu|at|pa|az|gu|mb|rc|ie|rd|ci|os|abr|mol|ven/)?printf("Italy\n"):printf("USA\n");

3

JavaScript的42

alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")

我最初是要从美国方面解决这个问题的,因为从美国名单中删除了KWXY,这使很多州都失去了...但是意大利却以17个字符的优势击败了它...

如果使用粗箭头符号,则可以将其简化为带有返回变量的简单函数。

r=s=>/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(s)?"Italy":"USA"

> r("South Dakota") // USA
> r("Puglia") // Italy
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.