Regex (ECMAScript 2018 หรือ. NET), 140 126 118 100 98 82 ไบต์
^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)
นี่ช้ากว่ารุ่น 98 ไบต์มากเพราะ^\1
อยู่ทางซ้ายของ lookahead และประเมินผลหลังจากนั้น ดูด้านล่างสำหรับ switcheroo แบบง่ายที่ได้ความเร็ว แต่ด้วยเหตุนี้ TIO สองตัวด้านล่างจะถูก จำกัด ให้ทำชุดทดสอบที่เล็กกว่าที่กำหนดไว้ก่อนหน้านี้และหนึ่งใน. NET นั้นช้าเกินไปที่จะตรวจสอบ regex ของตัวเอง
ลองออนไลน์! (ECMAScript 2018)
ลองออนไลน์! (.สุทธิ)
เมื่อต้องการลดขนาด 18 ไบต์ (118 → 100) ฉันขโมยการเพิ่มประสิทธิภาพที่ดีมากจากregex ของ Neilที่หลีกเลี่ยงความต้องการที่จะใส่ lookahead ใน lookbehind เชิงลบ (ให้ regex 80 ไบต์ที่ไม่ จำกัด ) ขอบคุณนีล!
นั่นกลายเป็นล้าสมัยเมื่อมันลดลงอย่างไม่น่าเชื่ออีก 16 ไบต์ (98 → 82) จากความคิดของเจย์เตอาซึ่งนำไปสู่เร็กคอร์ด 69 ไบต์ที่ไม่ จำกัด ! มันช้ากว่ามาก แต่นั่นคือกอล์ฟ!
โปรดทราบว่า(|(
no-ops สำหรับการทำ regex well-linked มีผลทำให้การประเมินช้ามากภายใต้. NET พวกเขาไม่ได้มีผลใน ECMAScript เพราะเป็นศูนย์ที่มีความกว้างตรงกับตัวเลือกที่ได้รับการปฏิบัติที่ไม่ตรงกับ-
ECMAScript ห้ามการใช้ปริมาณในการยืนยันดังนั้นสิ่งนี้ทำให้การเล่นกอล์ฟเป็นไปตามข้อกำหนดที่ จำกัด แหล่งที่มาได้ยากขึ้น อย่างไรก็ตาม ณ จุดนี้มันเป็นสนามกอล์ฟที่ดีมากที่ฉันไม่คิดว่าการ จำกัด ข้อ จำกัด นั้นจะเปิดโอกาสในการเล่นกอล์ฟต่อไป
ไม่มีอักขระพิเศษที่จำเป็นเพื่อให้ผ่านการ จำกัด ( 101 69 ไบต์):
^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))
มันช้า แต่การแก้ไขง่ายๆนี้ (เพียง 2 ไบต์พิเศษ) จะได้รับความเร็วที่หายไปทั้งหมดและอีกมากมาย:
^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))
^
(?!
(.*) # cycle through all starting points of substrings;
# \1 = part to exclude from the start
(.+) # cycle through all ending points of non-empty substrings;
# \2 = the substring
(.*$) # \3 = part to exclude from the end
(?<! # Assert that every character in the substring appears a total
# even number of times.
^\2 # Assert that our substring is not the whole string. We don't
# need a $ anchor because we were already at the end before
# entering this lookbehind.
| # Note that the following steps are evaluated right to left,
# so please read them from bottom to top.
^\1 # Do not look further left than the start of our substring.
(?=
# Assert that the number of times the character \8 appears in our
# substring is odd.
(
(
((?!\8).)*
(\8|\3$) # This is the best part. Until the very last iteration
# of the loop outside the {2} loop, this alternation
# can only match \8, and once it reaches the end of the
# substring, it can match \3$ only once. This guarantees
# that it will match \8 an odd number of times, in matched
# pairs until finding one more at the end of the substring,
# which is paired with the \3$ instead of another \8.
){2}
)*$
)
.*(.)+ # \8 = cycle through all characters in this substring
# Assert (within this context) that at least one character appears an odd
# number of times within our substring. (Outside this negative lookbehind,
# that is equivalent to asserting that no character appears an odd number
# of times in our substring.)
\3 # Skip to our substring (do not look further right than its end)
)
)
ฉันเขียนโดยใช้ lookahead โมเลกุล ( 103 69 bytes) ก่อนที่จะแปลงเป็น lookbehind ความยาวผันแปร:
^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))
^
(?!
.*(?*(.+)(.*$)) # cycle through all non-empty substrings;
# \1 = the current substring;
# \2 = the part to exclude from the end
(?! # Assert that no character in the substring appears a
# total even number of times.
^\1$ # Assert that our substring is not the whole string
# (i.e. it's a strict substring)
|
(?*(.)+.*\2$) # \3 = Cycle through all characters that appear in this
# substring.
# Assert (within this context) that this character appears an odd number
# of times within our substring.
(
(
((?!\3).)*
(\3|\2$)
){2}
)*$
)
)
และเพื่อช่วยในการทำให้ regex ของฉันเชื่อมโยงกันฉันได้ใช้รูปแบบของ regex ด้านบน:
(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1
เมื่อใช้กับregex -xml,rs -o
สิ่งนี้จะระบุสตริงย่อยที่เข้มงวดของอินพุตที่มีจำนวนคู่ของทุกอักขระ (ถ้ามี) แน่นอนว่าฉันสามารถเขียนโปรแกรมที่ไม่ใช่ regex เพื่อทำสิ่งนี้ให้ฉันได้ แต่ความสนุกจะอยู่ที่ไหน
abcbca -> False
.