この課題のために、部分文字列だけでなく文字列全体がパターンと一致する場合、正規表現パターンは文字列と一致すると言います。
与えられた2つの正規表現のパターン A と Bは、我々はと言う Aが され、より専門よりも B で一致したすべての文字列ならば Aは またで一致している B の周りに他の方法ではありません。私たちは、と言う Aが あると同等に B の両方のパターンが正確に文字列の同じセットと一致している場合。パターンが他のパターンよりも特殊化されておらず、同等でもない場合、A とB は比較できないと 言い ます。
たとえば、パターンHello, .*!
は、より特殊です.*, .*!
。パターン(Hello|Goodbye), World!
とHello, World!|Goodbye, World!
は同等です。パターンHello, .*!
と.*, World!
は比較できません。
「より専門化された」という関係は、正規表現パターンのセットの厳密な半順序を定義します。特に、すべてのパターン A および Bについて、正確に次のいずれかが当てはまります。
- A はBよりも特殊化されています (A < B)。
- B はAよりも特化されています (A > B)。
- A と B は同等です(A = B)。
- A 及び Bは (無類であるA ∥ B)。
ときに A と Bは 比類のないです、我々はさらに、2つの場合を区別することができます:
- A と Bが ある互いに素(A ∥ B文字列がそれらの両方にマッチしていないことを意味し、)。
- A 及び Bは れる交差(A ≬ Bをいくつかの文字列の両方にマッチしていることを意味します)。
チャレンジ
正規表現パターンのペアを受け取り、上記の順序を使用してそれらを比較するプログラムまたは関数を作成します。二つのパターンである場合つまり、 A と B、プログラムが判断する必要があるかどうかを A < B、 A > B、
A = B 又は A ∥ B。
×92%ボーナス パターンが比較できない場合に、プログラムがパターンが交差しているかどうかを判断すると、追加のボーナスが与えられます。
入出力
プログラムは、以下で定義するフレーバーの2つの正規表現パターンを文字列として受け入れる必要があります。関数の引数または同等のメソッドとして、コマンドラインであるSTDINから入力を読み取ることができます。パターンが有効であると仮定することができます。
プログラムは、比較の結果に応じて、正確に4つの異なる出力(または上記のボーナスを使用する場合は5つの異なる出力)の1つを生成する必要があります(正確な出力はユーザー次第です)。出力をSTDOUTに書き込むことができます。、関数の結果として返すか、同等のメソッドを使用します。
正規表現の味
任意の正規表現機能をサポートできますが、次のものをサポートする必要があります。
- 交替で
|
。 - 定量化と
*
。 (
およびでグループ化し)
ます。- 任意の文字(改行を除く可能性がある)とを一致させます
.
。 - (オプション:×80%ボーナス) 単純な文字クラスと否定された文字クラスをそれぞれ
[…]
と[^…]
で照合します。定義済みの文字クラス(例:)をサポートする必要はありませんが、[:digit:]
文字範囲をサポートする必要があります。 - でエスケープする文字
\
。少なくとも特殊文字(例:)|*().[^-]\
と、できれば他のフレーバーの一般的な特殊文字(例:)をエスケープすることは可能ですが、非特殊文字を{}
エスケープするときの動作は指定されていません。特に、\n
改行などの特別なエスケープシーケンスをサポートする必要はありません。考えられる実装は、後に続く文字を\
リテラルとして取得することです。
どのリテラルとも一致しない入力文字の存在を想定できます(つまり、.
文字クラスとのみ一致し、否定されます)。
追加の規則
- 正規表現ライブラリまたは組み込みの正規表現機能は、文字列の照合と置換の目的にのみ使用できます。
- 照合規則などのロケール関連の問題は無視してもかまいません。
- 明白なことを述べるには、プログラムを終了する必要があります。典型的なパターンが与えられた場合、妥当な時間内に実行する必要があります(明らかに1時間以内、できればずっと短い時間)。
得点
これはコードゴルフです。スコアは、コードサイズ(バイト単位)と任意のボーナスの積です。最低スコア勝ち。
テストケース
テストケースの形式は次のとおりです。
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
...
ここで、<Test ID>
テストケースのための識別子であり、<Pattern A>
かつ<Pattern B>
正規表現パターンであり、<Ordering>
それらの間の順序で、次のいずれかです。
<
:<Pattern A>
よりも専門化されてい<Pattern B>
ます。>
:<Pattern B>
よりも専門化されてい<Pattern A>
ます。=
:パターンは同等です。|
:パターンは比較できず、ばらばらです。X
:パターンは比較できず、交差しています。
特別な値<empty pattern>
は空のパターンを表します。
A.基本パターン
B.複雑なパターン
C.文字クラスを使用した基本パターン
D.文字クラスを含む複雑なパターン
テストプログラム
次のスニペットを使用して、正規表現パターンを比較できます。
<style>#main {display: none;}#main[loaded] {display: inline;}.pattern_container {position: relative;}.pattern_underlay, .pattern {font: 12pt courier, monospace;overflow: hidden;white-space: pre;padding: 7px;box-sizing: border-box;}.pattern_underlay {background-color: #dddddd;color: #707070;border-radius: 4px;box-shadow: 0.5px 0.5px 2.5px #aaaaaa;}.pattern_underlay[error] {background-color: #ffccbb;}.pattern {position: absolute;left: 0px;top: 0px;background: none;border: none;width: 100%;height: 100%;resize: none;white-space: normal;}#ordering {min-width: 28pt;text-align: center;font-size: 16pt;}#status {padding: 5px;background-color: #fffdce;box-shadow: 1.5px 1.5px 3.5px #aaaaaa;font-size: 10pt;white-space: pre;display: none;}#status[error] {display: inline;background-color: #ffe8df;}#status[loading] {display: inline;}.inline_code {background-color: #dddddd;font: 12pt courier, monospace;padding: 2px;}.placeholder {visibility: hidden;}.error_text {background-color: #fffcb7};</style><span id="main"><table><tr><td><div class="pattern_container"><div class="pattern_underlay" id="pattern1_underlay"></div><textarea class="pattern" id="pattern1" oninput="compare()">Hello, .*!</textarea></div></td><td id="ordering"></td><td><div class="pattern_container"><div class="pattern_underlay" id="pattern2_underlay"></div><textarea class="pattern" id="pattern2" oninput="compare()">.*, .*!</textarea></div></td></tr></table><br></span><span id="status" loading>Loading...</span><script type='text/javascript'>var Module = {setStatus: function (status) {document.getElementById("status").innerHTML = status;if (status == "") {compare();document.getElementById("status").removeAttribute("loading");document.getElementById("main").setAttribute("loaded", 1);}}};function underlay_chars(str) {if (/^\n*$/.exec(str))return str.split("\n").map(function () { return '<span class="placeholder"> \n</span>'; });if (str.indexOf("\n") >= 0)str = str.replace(/\s*$/gm, function (m) { return m.replace(/[^\n]/g, "\0"); });return (str + "\n").split("").map(function (c) {if (c == "\0") return "·";else return '<span class="placeholder">' + c + '</span>';});}function underlay_str(str) {return underlay_chars(str).join("");}function str_to_array32(str) {a = [];for (c of str) {n = c.charCodeAt(0);a.push(n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, n >> 24);}a.push(0, 0, 0, 0);return a;}function compare() {try {for (e of ["pattern1_underlay", "pattern2_underlay", "status"])document.getElementById(e).removeAttribute("error");for (e of ["pattern1", "pattern2"])document.getElementById(e + "_underlay").innerHTML = underlay_str(document.getElementById(e).value);c = Module.ccall("regex_compare", "number", ["array", "array"], [str_to_array32(document.getElementById("pattern1").value),str_to_array32(document.getElementById("pattern2").value)]);if (c >= 0)document.getElementById("ordering").innerHTML = "∥≬<>="[c];else {i = Module.ccall("regex_error_index", "number", [], []);l = Module.ccall("regex_error_length", "number", [], []);e = document.getElementById("pattern" + -c + "_underlay");t = underlay_chars(document.getElementById("pattern" + -c).value);e.setAttribute("error", 1);e.innerHTML =t.slice(0, i).join("") +'<span class="error_text">' + t.slice(i, i + l).join("") + "</span>" +t.slice(i + l).join("");e.setAttribute("error", 1);throw "Pattern error: " + Module.ccall("regex_error", "string", [], []).replace(/`(.*?)'/g, '<span class="inline_code">$1</span>');}} catch (e) {document.getElementById("ordering").innerHTML = "??";document.getElementById("status").innerHTML = e;document.getElementById("status").setAttribute("error", 1);}}</script><script async type="text/javascript" src="https://gist.githack.com/anonymous/91f27d6746566c7b4e4c/raw/c563bf84a01c3a1c6e5f021369a3e730a2e74a1a/rpo.js"></script>