Обратное регулярное выражение сложного процента


9

Koronkorko - финское слово для обозначения сложных процентов . Мы не хотим сложного интереса к нашим строкам, поэтому давайте найдем самое короткое из возможных регулярных выражений, чтобы исключить его.

Если задана строка, состоящая только из прописных буквенных символов AZ, определите самое короткое из возможных регулярных выражений, которое соответствует строке, если оно не содержит подстроки KORONKORKO. Любая строка, содержащая KORONKORKOподстроку, не должна соответствовать регулярному выражению.

Только символы A- Z, [, ], -, ^, , ?, *, +, |, (, и )следует использовать в выражении.

Я думаю, что это можно сделать с помощью 118 символов в выражении. Вы можете сделать это короче?

Примечание: этот вызов от Ohjelmointiputka (на финском языке).


Если бы !был разрешенный символ, вы могли бы сделать ^((?!KORONKORO).)*$за 19 байтов.
Mama Fun Roll

3
@MamaFunRoll Думаю, поэтому ! не разрешают.
Алекс А.

Мне доставило удовольствие попытаться обойти финский сайт, и я считаю, что вы ищете теоретические выражения регулярных выражений, которые соответствуют / отклоняют входную строку. Например, кажется, что сайт разрешает использование только внутри -и ^внутри классов символов (поэтому ^не может использоваться в качестве якоря), а совпадение учитывается только в том случае, если регулярное выражение соответствует всей строке (т.е. неявное окружение ^$, как в отличие от обычных "регулярных выражений", которые считают строку соответствующей, если какая-либо ее часть соответствует регулярному выражению)
Sp3000

Поэтому я удалил свой ответ PCRE, который, хотя и должен работать даже в PHP, в этом случае почти наверняка не предназначен.
Sp3000

Я забыл сказать, что сайт проверяет правильность выражения с помощью функции ereg PHP. Об этом говорилось в дискуссии на ohjelmointiputka.net/keskustelu/…
гостья

Ответы:


6

204 персонажа

(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?[^KO]|[^KR])|[^KO])|[^K])|[^KN])|[^KO])|[^KR])|[^KO])|[^K])*(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?)?)?)?)?)?)?)?)?

Генерируется путем превращения .*KORONKORKO.*в конечный автомат, обращения конечного автомата и превращения его в регулярное выражение.


Почему это стало лучшим ответом?
Балинт

1

Python, 77 79 97 118 байт

Редактировать 3: переписать. Использует вложенные lookaheads

^([^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^O]|O(?=$|[^N]|N(?=$|[^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^K]|K(?=$|[^O]))))))))))*$

Regex 101

Редактировать 2: Добавлено '$ |' на протяжении всего регулярного выражения. Теперь, если сопоставлен префикс KORONKORKO, следующий элемент для сопоставления - это конец строки, символ, заканчивающий префикс, или символ, который расширяет префикс, если за ним следует что-то, заканчивающее префикс.

Это регулярное выражение работает с re.fullmatch(), который был добавлен в Python 3.4. Для использования с re.match(), ^и $нужно добавить в начало и конец шаблона, соответственно, еще на 2 байта.

([^K]|K($|[^O]|O($|[^R]|R($|[^O]|O($|[^N]|N($|[^K]|K($|[^O]|O($|[^R]|R($|[^K]|K($|[^O]))))))))))*

Regex101 ссылка

Предыдущее неверное решение (см. Комментарии):

K|([^K]|K([^O]|O([^R]|R([^O]|O([^N]|N([^K]|K([^O]|O([^R]|R([^K]|K[^O])))))))))*

Редактировать: Добавлен сингл K


2
Я не верю, что это совпадает K.
orlp

@orip - Хороший улов. Исправлена.
RootTwo

Последнее обновление не работает дляKKORONKORKO
Sp3000

Это поправимо? Любые идеи?
RootTwo

1
Начало ^и конец $не нужны. Также =и $не допускаются.
LegionMammal978
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.