チャレンジ
有効な正規表現が与えられた場合、同じ文字列のセットに一致するが逆の正規表現を出力します。
タスク
この課題は、最も基本的な正規表現の操作を使用しています:^
、$
、?
、+
、*
、[]
、{}
、|
。キャプチャグループなどの複雑なものはありません。特殊文字はエスケープできます。
サンプル入出力
注:無効な入力は決して与えられず、通常、与えられた入力に対して複数の可能な答えがあります!
Input | Sample Output
-----------|-------------
abc | cba
tuv? | v?ut
a(b|c) | (c|b)a
1[23] | [23]1
a([bc]|cd) | (dc|[bc])a
^a[^bc]d$ | ^d[^bc]a$
x[yz]{1,2} | [yz]{1,2}x
p{2} | p{2}
q{7,} | q{7,}
\[c[de] | [de]c\[
ab[c | <output undefined>
a(?bc) | <output undefined>
a[]]bc | <output undefined>
デモ
正しい入力/出力を示す作業デモ。これには、実際の答えには必要ない入力を検証するための追加のロジックがあります。無効な入力は未定義の動作であると考えてください。
仕様
簡単にするために、すべての特殊文字には特別な意味があるか、エスケープされています。つまり[[]
、の文字範囲ではありません[
。長さの範囲は標準のPOSIX EREから取得されます。であること、{n}
、{n,}
、および{n,m}
サポートされています。文字範囲[]
と[^]
はサポートされています。これらのルールのため、また無効な入力が与えられないため、実際にはこれらの内容を出力に直接コピーするだけで十分です。最後に、貪欲さは重要ではありません。つまり、逆正規表現が最初に別の一致を見つけても問題ありません。同じ文字列セットの一致を見つける必要があるだけです。
得点
バイト単位の最小プログラム(ネットワーク要求などの不正行為を除く)が勝ちます。プログラムは、実際のIOを使用するか、単に関数を定義できます。
(^a|b)(c$|d)
ただし、テストケースのようなものを追加することもできます。
(a)?(b)+
↦ (b)+(a)?
?
()
。これは例で使用されています。
?
添付するものがないためです。/a(?bc)/
ブラウザのコンソールに入力してみてください。