xkcdコミックに触発されたメタ正規表現ゴルフの問題は既にあります
しかし、この正規表現ゴルフも楽しそうです!アメリカの州とイタリアの地域を区別したいと思います。どうして?私は両国の市民であり、常にこれに問題があります*。
イタリアの地域は
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
、簡単にする場合)を取得し、そのリストの名前をstdoutに出力する必要があります。この場合、リストの名前はItaly
and USA
です。
コードをテストするには、両方のリストを実行します。リストにない文字列の動作は未定義の場合があります。
スコアリングの問題
これは、言語ごとに行う必要があります。Perlでは、
m/foobarbaz/
一致する正規表現です。ただし、Pythonでは、
import re
re.compile('foobarbaz')
同じことをします。Pythonの引用は数えないので、Perlのm/
and 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
そうでない場合は返すだけです。