順列と一致します!


15

あなたの課題は、それ自体のすべての文字列の置換に一致する正規表現を作成することです。また、大文字と小文字を区別する必要があります。

したがって、たとえば、正規表現が次の場合:

ABC

これらの文字列と一致する必要があります(一致するだけです)。

ABC
ACB
BAC
BCA
CAB
CBA

次のようなものと一致しないはずです。

AABC (contains an extra A)
ABCD (contains an extra D)
AC   (no B)
AAA  (no B and C, extra 2 A's)
abc  (case-sensitive)

ルール:

  • 任意の種類の正規表現を使用できます。
  • 標準の抜け穴が適用されます。
  • コードには少なくとも2つの異なる文字が必要です。つまり、次のようなソリューション1は無効です。
  • 正規表現には、印刷可能なASCIIのみを含める必要があります。



私は考えました(ABC|ACB|BAC|BCA|CAB|CBA)が、あなたは一般的な答えを望んでいました。
スティーブンクアン

回答:


11

JavaScript、 64 57バイト

Martin Enderのおかげで4バイトが削除されました。

^(?!.*([^])(.*\1){3}]?)[$$[-^?!!.'''-*11{33}5577\\-]{57}$

ここで試してみてください。

説明(古い)

^                                  # Beginning of the string.
(?!.*                              # Match only the strings that don't contain...
  (.)(.*\1){4}                     #     5 occurrences of the same character.
  [^1]?[^1]?                       #     Something that doesn't matter.
)
[]zzz^(?!!!.**[)\\1{{44}}666]{64}  # 64 occurrences of these 16 characters.
                                   # Some are duplicated to make sure the regex
                                   # contains 4 occurrences of each character.
\z                                 # End of the string.

2
:私は、これは60のために働くと思う^(?!.*(\S)(.*\1){3}[^1]?)[]zzSS[-^?!!.'''-*1{33}0066-]{60}\z regex101
マーティン・エンダー

これは.NETでほとんど機能します^(?'4'(?!(.*\4){3})[]$$[\\^^?!!..'-*{}33-5-]){54}$[5]*
。– jimmy23013

動作しないものは何ですか?末尾の改行?
マーティンエンダー

@MartinEnderはい。
jimmy23013

2

PerlおよびPCRE正規表現、280バイト

^(?=(.*z){2})(?=(.*\(){43})(?=(.*\)){43})(?=(.*\*){22})(?=(.*\.){23})(?=(.*0){2})(?=(.*1){6})(?=(.*2){16})(?=(.*3){7})(?=(.*4){4})(?=(.*5){1})(?=(.*6){3})(?=(.*7){2})(?=(.*8){2})(?=(.*9){1})(?=(.*=){22})(?=(.*\?){22})(?=(.*\\){11})(?=(.*\^){2})(?=(.*\{){23})(?=(.*\}){23}).{280}\z

(少し)より読みやすい:

^
(?=(.*z){2})
(?=(.*\(){43})
(?=(.*\)){43})
(?=(.*\*){22})
(?=(.*\.){23})
(?=(.*0){2})
(?=(.*1){6})
(?=(.*2){16})
(?=(.*3){7})
(?=(.*4){4})
(?=(.*5){1})
(?=(.*6){3})
(?=(.*7){2})
(?=(.*8){2})
(?=(.*9){1})
(?=(.*=){22})
(?=(.*\?){22})
(?=(.*\\){11})
(?=(.*\^){2})
(?=(.*\{){23})
(?=(.*\}){23})
.{280}\z

これは、書かれているとおりO(2 ^ n)時間で実行されるため、非常に非効率です。それをテストする最も簡単な方法は、すべての出現を.*で置き換えることです.*?。これにより、一致するケースが最初にチェックされます(つまり、線形時間で一致しますが、一致しない場合は指数関数的な時間がかかります)。

基本的な考え方は、正規表現の長さを280に強制し、lookaheadアサーションを使用して、正規表現の各文字を少なくとも特定の回数だけ表示することです。たとえば(?=(.*z){2})z文字を少なくとも2回表示します。2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23280なので、文字の「余分な」出現はありません。

これは、オートグラムのプログラミング例です。オートグラムは、含まれる各文字の数(およびこの場合は、全体の長さ)をリストすることによってそれ自体を説明する文です。私はそれを構築することでかなり幸運になりました(通常はブルートフォースを使用する必要がありますが、作成を完了する前にブルートフォースプログラムをテストしているときにこのソリューションに出くわしました)。

PerlおよびPCRE正規表現、253バイト、Martin Enderとのコラボレーション

いくつかの数字を省略した短いソリューション(9、8、または7の可能性が高い)が存在する可能性があると仮定しました。マーティン・エンダーは、以下に示すものを見つけました:

^(?=(.*z){2})(?=(.*\(){39})(?=(.*\)){39})(?=(.*\*){20})(?=(.*\.){21})(?=(.*0){4})(?=(.*1){6})(?=(.*2){11})(?=(.*3){6})(?=(.*4){3})(?=(.*5){2})(?=(.*6){3})(?=(.*9){4})(?=(.*=){20})(?=(.*\?){20})(?=(.*\\){9})(?=(.*\^){2})(?=(.*{){21})(?=(.*}){21}).{253}\z

読み取り可能なバージョン:

^
(?=(。* z){2})
(?=(。* \(){39})
(?=(。* \)){39})
(?=(。* \ *){20})
(?=(。* \。){21})
(?=(。* 0){4})
(?=(。* 1){6})
(?=(。* 2){11})
(?=(。* 3){6})
(?=(。* 4){3})
(?=(。* 5){2})
(?=(。* 6){3})
(?=(。* 9){4})
(?=(。* =){20})
(?=(。* \?){20})
(?=(。* \\){9})
(?=(。* \ ^){2})
(?=(。* {){21})
(?=(。*}){21})
。{253} \ z

{}最後の2つの先読みでこれらをエスケープする必要はないと思います。また、先読みがなかっ(?=(.*5){1})5場合はないので、追加する必要もありません。1つの問題は$、末尾の改行を許可することです。したがって、jimmy \z$ように代わりに使用する必要がありますが\、最初の先読みで保存するので、1バイトはかかりません。
マーティンエンダー

私は数字のようなものを省略することが可能であることを知っています。しかし、彼らはオートグラムを機能させるためにそこにいます。プログラムの一部を削除すると、プログラムが正しく記述されなくなるため、残りの部分がすべて破損します。(各行のカウントは各行のカウントをカウントします!したがって、一般にプログラムを変更することは基本的に不可能です。)$文字列の最後に改行を許可することに関して、それは一般に正規表現がどのように呼び出されるかによって異なりますプログラム(通常、すでに行に解析されているコードで実行されます)。

または、より正確に言うと、(?=(.*5){1})この場合は必要です。私はそれを削除した場合、そこだろうので、プログラム中の5も(?=(.*1){6})ラインが今読まなければならないでしょう(?=(.*1){5})

末尾の改行については、正規表現への入力の種類に関するチャレンジに制限はないようです。したがって、通常は、すべての文字列で機能し、変更することを意味します $に対して\z機能必要がしても何の害もありませんオートグラムを壊さないでください)。
マーティンエンダー

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