正規表現、紙、はさみ、トカゲ、スポック


81

ウォームアップ:正規表現、紙、はさみ

これは、非常に短いソリューションが存在することに気付く前に、私が最初に投稿したかった課題です。それでも、以下の実際の課題に備えて考えることは興味深い問題になる可能性があります。

3つの正規表現RP、およびSを、それらが周期的なロック、ペーパー、はさみの方式で互いに一致するように記述します。特に、Rは、一致SをSは一致PPが一致Rが、しかしRは ない一致PをSは ない一致RをPが一致していないSを。便利な表を次に示します。

Regex   Matches   Doesn't match
R       S         P
P       R         S
S       P         R

RP、およびSがそれ自体を含む他の入力に対して何をするかは問題ではありません。

ここで、一致とは、入力の一部の(おそらく空の)サブストリングが一致することを意味します。一致は入力全体をカバーする必要はありません。

課題:正規表現、紙、はさみ、トカゲ、スポック

この課題では、RPSの変種であるRock、Paper、Scissors、Lizard、Spock(The Big Bang Theoryで普及)に基づいて、上記の問題のより厳しいバージョンを解決します。RPSLVには、2つのサイクルで互いに勝つ5つの異なるシンボルがあります。

  • ロック→はさみ→トカゲ→紙→スポック→ロック
  • ロック→トカゲ→スポック→はさみ→紙→ロック

入力として互いに与えられたときにこの構造を模倣する5つの正規表現RPSL、およびVを記述する必要があります。対応する表は次のとおりです。

Regex   Matches   Doesn't match
R       L, S      V, P
L       V, P      S, R
V       S, R      P, L
S       P, L      R, V
P       R, V      L, S

ただ、明確にするために、あなたがすべきではない文字列に一致するRPなど、他の正規表現。たとえば、正規表現R^\w$たとえば、PVが文字列に一致する必要がある場合^\w$SLは一致しません。

繰り返しますが、一致とは、入力の少なくとも1つの(おそらく空の)部分文字列が一致することを意味します。一致は入力全体をカバーする必要はありません。たとえば、\b(単語の境界)はhello(先頭と末尾で)一致し(^,^)ますが、一致しません。

任意の正規表現フレーバーを使用できますが、回答に選択肢を記載し、可能であれば、選択したフレーバーのオンラインテスターへのリンクを提供してください。フレーバーのホスト言語(Perlフレーバーのe修飾子など)でコードを呼び出すことができる正規表現機能を使用することはできません。

区切り/regex/文字(など)は、別の入力として指定された場合、正規表現に含まれません。また、正規表現の外側にある修飾子を使用することはできません。一部のフレーバーでは、のようなインライン構文で修飾子を使用できます(?s)

スコアは、5つの正規表現の長さの合計(バイト単位)です。低いほど良い。

それは見つけることがずっと簡単であることが判明し、それは最初に見えるかもしれませんよりも、この問題に取り組んで解決策を、私は最適解を見つけることは非常にトリッキーであることを願っています。


たとえば、RはSの正規表現全体またはSの部分文字列に一致する必要がありますが、PまたはVの部分文字列に一致しない場合、
Okx

@Okx「一致はただ入力の少なくとも一つ(空)ストリングが一致していることを意味している。試合は入力全体をカバーする必要はありません。例えば\b(ワード境界)マッチhello(最初と最後)が、一致しません(^,^)。」
マーティンエンダー

1
おそらく、正規表現がそれ自体と一致するかどうかは関係ありませんか?
ブリリアンド

@Brilliand Correct。
マーティンエンダー

1
素晴らしいパズル。誰もが興味を持っている場合、私は、ここにインタラクティブバージョンを作成しました:shark.fish/rock-paper-scissors
shark.dp

回答:


45

PCRE .NET、35 32バイト

マーティン・エンダーのおかげで-3バイト

岩:

([*?]$)

論文:

[)$]$+

はさみ:

[+?]$.*

トカゲ:

[+$]$.?

スポック:

[*)]$

ここでのアイデアは、予約された正規表現文字である他の正規表現の末尾の文字を一致させることですが、文字クラス内ではそのように扱われることを止めます。


1
さて、あなたは勝ちます:P
ETHproductions

3
物事を置くの卑劣な使用後に積極的に使用し、マッチング可能時に受動的に使用された場合は無視なるEOL「$」
Stilez

44

PCRE、15 14バイト

岩:
B

論文:
\b$

はさみ:
b|B.

トカゲ:
\B.

スポック:
^\w


4
非常に印象的。
エリックドゥミニル

無敵!私はRock =をいじっていましたQ(Lizard = `\ Q \`に14bのソリューションが1つあり、残りはあなたのものに似ています)が、まったく役に立ちません。
jaytea

40

派手な機能なし、35 30バイト

その使用ニールのアイデアによって保存された5つのバイト]がない必要があります\

これは、たとえばpython reモジュールで機能します。

R='[SLR]]'
P='[RVP]]'
S='[PLS]]'
L='[PVL]]'
V='[SRV]]'

]どのルールであるかを示す文字が先行するものを検索します。

使用された以前のバージョンR='\[[RSL]'など

スコア40の以前の試みでは、R='[SL]x|Rx'etcなどを使用していました。


1
すべてを逆にすることで5バイトを節約しますR='[LSR]]'。など
ニール

@Neilそれは大きな改善です、ありがとう!
クリスチャンシーバーズ

This works with python's reよく、Pythonはおそらく、ヘッダでなければなりません

1
@cat私も「たとえば」と書きました。文全体は、私が実際に試した具体的なことを言っているだけです。他の人がやったようにPOSIXを言うことができると思いますが、私のヘッダーはかなり正しいと思います。
クリスチャンシーバーズ



8

JavaScript、45バイト

別の些細な解決策。

R:
^R|^.[SL]
P:
^P|^.[RV]
S:
^S|^.[PL]
L:
^L|^.[PV]
V:
^V|^.[SR]

私の答えはあなたのより長い/類似したバージョンであることに気づいたので、削除してほしいですか?
TheLethalCoder

4
@TheLethalCoder現在、すべての回答は、互いにより長い/短いバージョンです:p
dzaima

1
私は...笑仮定
TheLethalCoder

5

POSIX、50 45バイト

Rock
.{5}RP?V?
Paper
.{5}PS?L?
Scissors
.{5}SR?V?
Lizard
.{5}LR?S?
Vulcan (Spock)
.{5}VP?L?

短くすることもできますが、($の後に一致を隠す)トリックが使用されるため、別の方法を探しています

一致する場合、各文字列の最初の5文字は無視されます。したがって、有効なターゲット文字列は、X?Y?に単純化されます。「?」のため、二重文字はありません。は通常の文字であるため、正規表現として使用する場合は最後の4文字が一致する必要があります(ヌル文字列)。そのため、パターンは「5文字とそれに続くターゲット文字」に集約されます。つまり、ターゲットの6〜9文字にターゲット文字(各文字列の5番目の文字)が含まれている必要があります。

更新:下の35バイトバージョン、今!


私はいつもVV ulcanのためではなく、Vulcanの敬礼の形(RPSLVを直接プレイするときにSpockを表すために使用する手のジェスチャー)を表すためだと思っていました。
マーティンエンダー

とにかく、PPCGへようこそ!いい最初の答え。既存のすべての回答と比較してロジックを逆にしたことが好きです(1文字のみを照合し、現在の正規表現を破る文字を正規表現に入れます)。
マーティンエンダー

POSIXは文字列の先頭に一致を自動的に固定しますか?そうでなければ、それらのコンマをドロップできませんでしたか?
マーティンエンダー

POSIXだと思います。percかもしれません。しかし、はい、うまく見つけました!5文字少ない!
-Stilez

4
Jellyと競争する必要はありません。好きな言語を選んで楽しんでください。:)
マーティンエンダー

3

PCRE、65バイト

これは本当に些細な解決策であり、まったく賢くはありませんが、ゴルフを試してみます。

V:

(?#V).+[SR]\)

L:

(?#L).+[PV]\)

S:

(?#S).+[PL]\)

P:

(?#P).+[RV]\)

R:

(?#R).+[SL]\)

基本的に、各正規表現にはコメントの形式の「識別子」があり、他の正規表現に一致するかどうかを指示します。


3

.NET、50バイト

順番にR, P, S, L, V

[^R]\^[SL]
[^P]\^[RV]
[^S]\^[PL]
[^L]\^[PV]
[^V]\^[SR]

[^R]他の各式で識別子グループ(たとえば、)を検索することにより機能します。

表現を^R|\^[SL]に変更する、または同様のものは機能しているように見えますが、45バイトになりますが、@ dzaimaの答えに少し似すぎます。


3

バニラRE、40文字

最も簡潔でエレガントなソリューションではありませんが、心地よい準セマンティックな視覚構造を備えています!

[^r][sl]
[^p][vr]
[^s][lp]
[^l][pv]
[^v][rs]

ロックははさみまたはトカゲを
打つ紙はバルカンまたは岩を
打つはさみはトカゲまたは紙を
打つトカゲは紙または
バルカンを打つバルカンは岩またははさみを打つ


2

POSIX、35バイト

Rock
R?^[LS]
Paper
P?^[RV]
Scissors
S?^[LP]
Lizard
L?^[PV]
Vulcan (Spock)
V?^[RS]

開始/終了記号の後ろに「隠す」ためのまったく異なる方法なので、私はそれについて大丈夫だと感じます:) 他の方法で行う場合は、常にletterとend / $の間を移動する必要があります。

私の最初の解決策よりも10バイト少なく、概念的にはシンプルで、私が気に入っているボーナスです。

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