Зворотний регекс складних відсотків


9

Коронкорко - фінське слово для складної зацікавленості . Ми не хочемо складеного інтересу до наших рядків, тому давайте знайдемо найкоротший можливий регулярний вираз, щоб виключити його.

З огляду на рядок, що складається лише з великих алфавітних символів AZ, визначте найкоротший можливий регулярний вираз, що відповідає рядку, якщо він не містить підрядку KORONKORKO. Будь-який рядок, що містить KORONKORKOпідрядку, не повинен відповідати регулярним виразом.

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

Я думаю, що це можна зробити із виразом 118 символів. Ви можете зробити це коротшим?

Примітка. Цей виклик - від Ohjelmointiputka (фінською мовою).


Якби !дозволений символ, ти міг би зробити це ^((?!KORONKORO).)*$за 19 байт.
Mama Fun Roll

3
@MamaFunRoll Я думаю, що тому ! не дозволяють.
Олексій А.

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

Як такий, я видалив свою відповідь 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

Пітон, 77 79 97 118 байт

Правка 3: Перепишіть. Використовується вкладені макарони

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

Регекс 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.