正規表現(ECMAScriptの2018または.NET)、140の 126 118 100 98 82バイト
^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)
これは、98バイトバージョンよりもはるかに低速です。これは^\1
、先読みの左側にあり、その後に評価されるためです。速度を取り戻す簡単なスイッチャーについては、以下を参照してください。しかし、これにより、以下の2つのTIOは以前よりも小さなテストケースセットを完了することに制限され、.NETのTIOは独自の正規表現をチェックするには遅すぎます。
オンラインでお試しください!(ECMAScript 2018)
オンラインでお試しください!(。ネット)
18バイト(118→100)をドロップするために、ネイルの正規表現からネガティブルックビハインド内に先読みを配置する必要がない(80バイトの無制限の正規表現を生成する)本当にすてきな最適化を盗みました。ありがとう、ニール!
それは、69バイトの無制限の正規表現につながったjayteaのアイデアのおかげで、信じられないほどの16バイト(98→82)を落としたときに時代遅れになりました!それははるかに遅いですが、それはゴルフです!
(|(
正規表現を適切にリンクするためのノーオペレーションは、.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)
)
)
可変長の後読みに変換する前に、分子先読み(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
。