Bu zorluğun amacı doğrultusunda, tüm dize yalnızca bir alt dize değil, desenle eşleştirilirse , regex modelinin bir dizeyle eşleştiğini söylüyoruz .
Verilen iki regex desenleri A ve B , biz demek bir edilir daha uzman daha B ile eşleşen her dize eğer A da örtüşmektedir B tersi değil. Biz söylemek A olan eşdeğer etmek B hem desenler tam olarak dizeleri aynı seti eşleşirse. Ne desen daha diğerinden daha uzmanlaşmış ne de eşdeğerdir edilirse, demek A ve B olan eşsiz .
Örneğin, model Hello, .*!
fazla uzmanlaşmış .*, .*!
; Desenler (Hello|Goodbye), World!
ve Hello, World!|Goodbye, World!
eşdeğerdir; ve desenler Hello, .*!
ve .*, World!
kıyaslanamaz.
"Daha uzmanlaşan" ilişkisi, regex kalıpları setinde katı bir kısmi düzen tanımlar. Özellikle, tüm A ve B kalıpları için , tam olarak aşağıdakilerden biri doğrudur:
- A , B'den ( A < B ) daha uzmandır .
- B , A'dan ( A > B ) daha uzmandır .
- A ve B eşittir ( A = B ).
- A ve B karşılaştırılamaz ( A ∥ B ).
Ne zaman bir ve B kıyaslanamaz, biz daha iki dava arasında ayrım yapabilir:
- A ve B birbirinden ayrıdır ( A ∥ B ), bu da hiçbir dize tarafından eşleştirilmediği anlamına gelir.
- A ve B olan kesişen ( A ≬ B ) bazı dizeleri hem eşlenmişlerdir anlamına gelir.
Meydan okuma
Bir çift regex paterni alan ve yukarıdaki sırayı kullanarak karşılaştıran bir program veya fonksiyon yazın . Yani, eğer iki kalıp A ve B ise, program A < B , A > B ,
A = B veya A ∥ B olup olmadığını belirlemelidir .
× 92% Bonus Modeller karşılaştırılamaz olduğunda, program kesişen veya ayrık olup olmadıklarını belirlerse ek bir bonus verilir.
Giriş ve çıkış
Program, aşağıda tanımlanan tatta, dizge olarak iki regex şablonunu kabul etmelidir. Girdileri STDIN , komut satırı , işlev argümanları veya eşdeğer bir yöntem olarak okuyabilirsiniz . Modellerin geçerli olduğunu varsayabilirsiniz.
Program, karşılaştırmanın sonucuna bağlı olarak (kesin çıktılar size bağlıdır.) Tam olarak dört ayrı çıktıdan (ya da yukarıdaki ikramiyeye gidiyorsanız beş ayrı çıktıdan) birini üretmelidir . Çıktıyı STDOUT'a yazabilirsiniz. , işlevin sonucu olarak döndürün veya eşdeğer bir yöntem kullanın .
Regex Lezzet
Sen sever özellikleri ne olursa olsun regex destekleyebilir, ancak gerekir aşağıdaki olanları destekler:
- Münavebe ile
|
. - Niceleme ile
*
. - Gruplandırma ile
(
ve)
. - Herhangi bir karakterin eşleştirilmesi (muhtemelen yeni satırlar hariç)
.
. - (İsteğe bağlı: × 80% Bonus) Basit ve olumsuz karakter sınıflarını sırasıyla
[…]
ve ile eşleştirme[^…]
. Önceden tanımlanmış herhangi bir karakter sınıfını (örn.[:digit:]
) Desteklemeniz gerekmez, ancak karakter aralıklarını desteklemelisiniz. - Karakter kaçan ile
\
. En azından özel karakterleri (örn.|*().[^-]\
) Ve tercihen diğer tatlardaki ortak özel karakterleri (örn. ) Çıkartabilmek mümkün olmalıdır, ancak özel{}
olmayan karakterlerden kaçma davranışı belirtilmez. Özellikle,\n
bir newline ve benzeri gibi özel kaçış dizilerini desteklemeniz gerekmez . Muhtemel bir uygulama basitçe onu izleyen karakteri almaktır\
.
Herhangi bir değişmez tarafından eşleştirilemeyen bir giriş karakterinin varlığını varsayabilirsiniz (yani, yalnızca .
karakter sınıfları ile eşleştirilebilir ve olumsuzlanabilir).
Ek Kurallar
- Regex kitaplıklarını veya yerleşik regex işlevselliğini yalnızca dize eşleme ve değiştirme amacıyla kullanabilirsiniz.
- Harmanlama kuralları gibi yerel ayarlarla ilgili sorunları görmezden gelebilirsiniz.
- Açık bir şekilde ifade etmek için: programınız sonlandırılmalıdır. Tipik desenleri verilen makul bir süre içinde gerçekleştirmelidir (kesinlikle bir saatten fazla değil, tercihen çok daha az)
puanlama
Bu kod golfü. Puanınız ürün arasında kod boyutu bayt cinsinden, ve herhangi ikramiye . En düşük puan kazanır.
Test Kılıfları
Test senaryolarının formatı aşağıdaki gibidir:
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
...
Nerede <Test ID>
test durumu için bir tanımlayıcı olup, <Pattern A>
ve <Pattern B>
düzenli ifade desenleri ve <Ordering>
aralarındaki sıralamaya ve biridir:
<
:<Pattern A>
daha uzmanlaşmıştır<Pattern B>
.>
:<Pattern B>
daha uzmanlaşmıştır<Pattern A>
.=
: Desenler eşdeğerdir.|
: Desenler karşılaştırılamaz ve ayrılmazdır.X
: Desenler karşılaştırılamaz ve kesişen.
Özel değer <empty pattern>
boş kalıp anlamına gelir.
A. Temel kalıplar
B. Karmaşık desenler
C. Karakter sınıfları ile temel desenler
D. Karakter sınıfları ile karmaşık desenler
Test programı
Regex kalıplarını karşılaştırmak için aşağıdaki kod parçası kullanılabilir:
<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>