ウォームアップ:正規表現、紙、はさみ
これは、非常に短いソリューションが存在することに気付く前に、私が最初に投稿したかった課題です。それでも、以下の実際の課題に備えて考えることは興味深い問題になる可能性があります。
3つの正規表現R、P、およびSを、それらが周期的なロック、ペーパー、はさみの方式で互いに一致するように記述します。特に、Rは、一致Sを、Sは一致PとPが一致Rが、しかしRは ない一致Pを、Sは ない一致RをとPが一致していないSを。便利な表を次に示します。
Regex Matches Doesn't match
R S P
P R S
S P R
R、P、およびSがそれ自体を含む他の入力に対して何をするかは問題ではありません。
ここで、一致とは、入力の一部の(おそらく空の)サブストリングが一致することを意味します。一致は入力全体をカバーする必要はありません。
課題:正規表現、紙、はさみ、トカゲ、スポック
この課題では、RPSの変種であるRock、Paper、Scissors、Lizard、Spock(The Big Bang Theoryで普及)に基づいて、上記の問題のより厳しいバージョンを解決します。RPSLVには、2つのサイクルで互いに勝つ5つの異なるシンボルがあります。
- ロック→はさみ→トカゲ→紙→スポック→ロック
- ロック→トカゲ→スポック→はさみ→紙→ロック
入力として互いに与えられたときにこの構造を模倣する5つの正規表現R、P、S、L、および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
ただ、明確にするために、あなたがすべきではない文字列に一致するR
、P
など、他の正規表現。たとえば、正規表現Rが^\w$
たとえば、PとVが文字列に一致する必要がある場合^\w$
、SとLは一致しません。
繰り返しますが、一致とは、入力の少なくとも1つの(おそらく空の)部分文字列が一致することを意味します。一致は入力全体をカバーする必要はありません。たとえば、\b
(単語の境界)はhello
(先頭と末尾で)一致し(^,^)
ますが、一致しません。
任意の正規表現フレーバーを使用できますが、回答に選択肢を記載し、可能であれば、選択したフレーバーのオンラインテスターへのリンクを提供してください。フレーバーのホスト言語(Perlフレーバーのe
修飾子など)でコードを呼び出すことができる正規表現機能を使用することはできません。
区切り/regex/
文字(など)は、別の入力として指定された場合、正規表現に含まれません。また、正規表現の外側にある修飾子を使用することはできません。一部のフレーバーでは、のようなインライン構文で修飾子を使用できます(?s)
。
スコアは、5つの正規表現の長さの合計(バイト単位)です。低いほど良い。
それは見つけることがずっと簡単であることが判明し、それは最初に見えるかもしれませんよりも、この問題に取り組んで解決策を、私は最適解を見つけることは非常にトリッキーであることを願っています。
\b
(ワード境界)マッチhello
(最初と最後)が、一致しません(^,^)
。」