정규식 (ECMAScript를 .NET 2018) 140 126 118 100 98 82 바이트
^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)
이 코드는 ^\1
lookahead의 왼쪽에 남아 있기 때문에 98 바이트 버전보다 훨씬 느립니다 . 속도를 회복하는 간단한 스위처에 대해서는 아래를 참조하십시오. 그러나 이로 인해 아래의 두 TIO는 이전보다 작은 테스트 사례를 완료하는 것으로 제한되며 .NET은 자체 정규식을 확인하기에는 너무 느립니다.
온라인으로 사용해보십시오! (ECMAScript 2018)
온라인으로 사용해보십시오! (.그물)
18 바이트 (118 → 100)를 삭제하기 위해 Neil의 정규 표현식 에서 부당한 룩을 훔쳐서 부정적인 lookbehind 안에 미리보기를 넣지 않아도됩니다 (80 바이트 무제한 정규 표현식). 고마워, 닐!
jaytea 의 아이디어 덕분에 69 바이트 무제한 정규 표현식으로 인해 16 바이트 (98 → 82)가 더 많이 떨어졌을 때 그것은 더 이상 사용되지 않습니다 ! 훨씬 느리지 만 골프입니다!
것을 참고 (|(
잘 연결된 정규식을위한 작전이 만드는 결과가없는 아주 천천히 .NET에서 평가한다. 너비가 0 인 선택적 일치는 일치 하지 않는 것으로 취급 되므로 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)
)
)
가변 길이 lookbehind로 변환하기 전에 분자 lookahead ( 103 69 바이트)를 사용하여 작성했습니다 .
^(?!.*(?*(.+)(.*$))(?!^\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}
)*$
)
)
그리고 정규 표현식 자체를 잘 연결하기 위해 위의 정규 표현식을 변형하여 사용했습니다.
(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1
와 함께 사용 regex -xml,rs -o
하면 짝수 개의 모든 문자 (있는 경우)가 포함 된 입력의 엄격한 하위 문자열을 식별합니다. 물론, 나는 이것을 위해 정규식이 아닌 프로그램을 작성할 수 있었지만 그 재미는 어디에 있습니까?
abcbca -> False
.