Ваша задача - создать регулярное выражение, соответствующее каждой перестановке строк, и ничего больше. Соответствие также должно учитывать регистр.
Так, например, если ваше регулярное выражение:
ABC
Он должен соответствовать (и только соответствовать) этим строкам:
ABC
ACB
BAC
BCA
CAB
CBA
Это не должно соответствовать вещам как:
AABC (contains an extra A)
ABCD (contains an extra D)
AC (no B)
AAA (no B and C, extra 2 A's)
abc (case-sensitive)
Правила:
- Вам разрешено использовать любой вкус регулярных выражений, который вам нравится.
- Применяются стандартные лазейки.
- В вашем коде должно быть как минимум два разных символа. Это означает, что такие решения
1
являются недействительными. - Регулярное выражение должно содержать только печатный ASCII и ничего больше.
(ABC|ACB|BAC|BCA|CAB|CBA)
но вы хотели обобщенный ответ.Ответы:
JavaScript,
6457 байт4 байта удалено благодаря Мартину Эндеру.
Попробуй это здесь.
Пояснения (устаревшие)
источник
^(?!.*(\S)(.*\1){3}[^1]?)[]zzSS[-^?!!.'''-*1{33}0066-]{60}\z
regex101^(?'4'(?!(.*\4){3})[]$$[\\^^?!!..'-*{}33-5-]){54}$[5]*
Регулярные выражения Perl и PCRE, 280 байт
(Чуть) более читабельно:
Это выполняется за O (2 ^ n) времени, как написано, поэтому невероятно неэффективно. Самый простой способ проверить это, чтобы заменить каждое вхождение
.*
с.*?
, что вызывает тот случай , когда он соответствует , чтобы проверить первое ( что означает , что он соответствует в линейное время, но по- прежнему занимает экспоненциальное время , если оно не совпадает).Основная идея состоит в том, что мы устанавливаем длину регулярного выражения равной 280, и используем косвенные утверждения, чтобы каждый символ в регулярном выражении появлялся по крайней мере определенное количество раз, например,
(?=(.*z){2})
заставляетz
символ появляться по крайней мере дважды.2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23
равно 280, поэтому у нас не может быть никаких «лишних» вхождений каких-либо символов.Это пример программирования автограммы , предложения, которое описывает себя, перечисляя номер каждого символа, который он содержит (и, в данном случае, также общую длину). Мне очень повезло в его создании (обычно вам приходится использовать грубую силу, но я наткнулся на это решение, пока тестировал свою программу грубой силы, прежде чем полностью ее написать).
Perl и PCRE regex, 253 байта, в сотрудничестве с Мартином Эндером
Я предположил, что могут быть более короткие решения, в которых пропущены некоторые цифры (скорее всего, 9, 8 или 7). Мартин Эндер нашел один, показанный ниже:
Читаемая версия:
источник
{}
в последних двух взглядах. Вам также не нужно добавлять такие вещи, как,(?=(.*5){1})
потому что не было бы,5
если бы у вас не было этого взгляда. Одна из проблем заключается в том, что$
допускается завершающий перевод строки, поэтому вам нужно использовать\z
его вместо того,$
как это делал Джимми, но я думаю, что это не будет стоить вам байта, поскольку вы сохраняете его\
в первом запросе.$
разрешения новой строки в конце строки, это обычно зависит от того, как регулярное выражение вызывается окружающим программа (обычно они выполняются на коде, который уже разбит на строки).(?=(.*5){1})
в этом случае. Если бы я удалил его, в программе было бы 5, потому(?=(.*1){6})
что теперь строка должна была бы прочитать(?=(.*1){5})
.$
на\z
не приносит никакого вреда (и не не ломай автограмму).\$
...$
кz
...\z
. Это работает; Я пойду поменяю это.