이 문제를 해결하기 위해 전체 문자열이 하위 문자열이 아닌 패턴과 일치하는 경우 정규식 패턴이 문자열과 일치한다고 말합니다 .
을 감안할 때 두 정규식 패턴 와 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 ).
때 와 B는 비교할 수없는, 우리는 더 이가지 경우를 구별 할 수 있습니다 :
- A 와 B 는 분리 되어 있고 ( A ∥ B ), 두 문자열이 모두 일치하는 문자열이 없음을 의미합니다.
- A 와 B 는 교차하고 있습니다 ( A ≬ B ). 이는 일부 문자열이 둘 다 일치 함을 의미합니다.
도전
정규식 패턴 쌍을 취하여 위의 순서를 사용하여 비교 하는 프로그램 이나 함수 를 작성하십시오 . 두 패턴 인 경우 즉, 및 B 프로그램을 결정할지 여부 < B , > B , = B 또는 ∥ B .
× 92 % 보너스 패턴을 비교할 수 없을 때 프로그램이 패턴이 교차하는지 또는 분리되어 있는지 판단하면 추가 보너스가 제공됩니다.
입력과 출력
프로그램은 아래 정의 된 특징에서 문자열로 두 개의 정규식 패턴을 수용해야합니다. STDIN , 명령 행을 통해 입력을 함수 인수 또는 동등한 메소드 로 읽을 수 있습니다 . 패턴이 유효하다고 가정 할 수 있습니다.
프로그램은 비교 결과 (정확한 출력이 사용자에게 달려 있음)에 따라 정확히 4 개의 고유 한 출력 중 하나 (또는 위의 보너스를 받으려는 경우 5 개의 고유 한 출력)를 생성해야합니다. 출력을 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>