Регулярные выражения Perl и PCRE, 280 байт
^(?=(.*z){2})(?=(.*\(){43})(?=(.*\)){43})(?=(.*\*){22})(?=(.*\.){23})(?=(.*0){2})(?=(.*1){6})(?=(.*2){16})(?=(.*3){7})(?=(.*4){4})(?=(.*5){1})(?=(.*6){3})(?=(.*7){2})(?=(.*8){2})(?=(.*9){1})(?=(.*=){22})(?=(.*\?){22})(?=(.*\\){11})(?=(.*\^){2})(?=(.*\{){23})(?=(.*\}){23}).{280}\z
(Чуть) более читабельно:
^
(?=(.*z){2})
(?=(.*\(){43})
(?=(.*\)){43})
(?=(.*\*){22})
(?=(.*\.){23})
(?=(.*0){2})
(?=(.*1){6})
(?=(.*2){16})
(?=(.*3){7})
(?=(.*4){4})
(?=(.*5){1})
(?=(.*6){3})
(?=(.*7){2})
(?=(.*8){2})
(?=(.*9){1})
(?=(.*=){22})
(?=(.*\?){22})
(?=(.*\\){11})
(?=(.*\^){2})
(?=(.*\{){23})
(?=(.*\}){23})
.{280}\z
Это выполняется за 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). Мартин Эндер нашел один, показанный ниже:
^(?=(.*z){2})(?=(.*\(){39})(?=(.*\)){39})(?=(.*\*){20})(?=(.*\.){21})(?=(.*0){4})(?=(.*1){6})(?=(.*2){11})(?=(.*3){6})(?=(.*4){3})(?=(.*5){2})(?=(.*6){3})(?=(.*9){4})(?=(.*=){20})(?=(.*\?){20})(?=(.*\\){9})(?=(.*\^){2})(?=(.*{){21})(?=(.*}){21}).{253}\z
Читаемая версия:
^
(? = (. * Г) {2})
(? = (. * \ () {39})
(? = (. * \)) {39})
(? = (. * \ *) {20})
(? = (. * \.) {21})
(? = (. * 0) {4})
(? = (. * 1) {6})
(? = (. * 2) {11})
(? = (. * 3) {6})
(? = (. * 4) {3})
(? = (. * 5) {2})
(? = (. * 6) {3})
(? = (. * 9) {4})
(? = (. * =) {20})
(? = (. * \?) {20})
(? = (. * \\) {9})
(? = (. * \ ^) {2})
(? = (. * {) {21})
(? = (. *}) {21})
. {253} \ г