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