正規表現ゴルフ:イタリアの地域と米国の地域


23

xkcdコミックに触発されたメタ正規表現ゴルフの問題は既にあります

copyright 2013ランドール・マンロー

しかし、この正規表現ゴルフも楽しそうです!アメリカの州とイタリアの地域を区別したいと思います。どうして?私は両国の市民であり、常にこれに問題があります*

イタリアの地域は

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のいずれかのリストから単一のエントリ(オプションで後に続く\nEOF、簡単にする場合)を取得し、そのリストの名前をstdoutに出力する必要があります。この場合、リストの名前はItalyand 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

*実際、それは嘘です。私はこれに関してまったく問題を経験したことがありません。


「フィルタリングなし、置換なし、何もない...たとえそれらが正規表現で行われたとしても」という意味を説明してください。明確にするために、それはフィルタリング、州/地域のリストの置換、またはフォーカスが広いことを意味しますか?
アビジット2014年

@Abhijit編集。それは明確ですか?
ブースバイ14年

3
Eliseod'Annunzio @:DCはない状態
カイルKanos

1
「リストにない文字列の動作は未定義の場合があります。」 この規則は破られています。このUSAような文字列の場合に戻ることができるため、イタリアの地域を確認する必要があり、USAそうでない場合は返すだけです。
o0 '。

1
@boothbyまあ、いや、それは単純なロジックです。基本的に正規表現のみにイタリアの地域と一致するように求めていますが、不必要に非常に複雑な方法で表現されています。このバグのおかげで、アメリカの州についての全体的な点は、実際に尋ねられた質問とはまったく関係ありません。また、これにより、質問の面白さが少なくなります。
o0 '。

回答:


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": "イタリア\ n"'
仮名14年

3
@仮名:ええ。スコアに含まれない限り、読みやすくすることもできます。
イルマリカロネン14年

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.