Perl ve PCRE normal ifadesi, 280 bayt
^(?=(.*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
(Biraz) daha okunabilir:
^
(?=(.*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
Bu, O (2 ^ n) zamanında yazıldığı gibi çalışır, bu yüzden inanılmaz derecede verimsizdir. Bunu test etmenin en kolay yolu her geçtiği değiştirmektir .*
ile .*?
ilk kontrol edilecek maçları davayı neden olur (bu doğrusal zamanda maçları, yani ancak maç için başarısız olursa hala üstel zaman alır).
Temel fikir, normal ifadenin uzunluğunu 280'e eşit tutmamız ve normal ifadedeki her karakteri en az belirli sayıda görünmeye zorlamak için ileriye dönük iddialar kullanmamızdır, örneğin (?=(.*z){2})
, z
karakteri en az iki kez görünmeye zorlar . 2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23
280 olduğundan herhangi bir karakterin "ekstra" tekrarına sahip olamazız.
Bu bir programlama örneğidir autogram , (bu durumda, ayrıca toplam uzunluğu ve benzeri) içerdiği her karakter sayısını listeleyerek kendisini tanımlayan bir cümle. Onu inşa etmede oldukça şanslıydım (normalde kaba kuvvet kullanmanız gerekiyor, ancak kaba kuvvet programımı yazmayı tamamen bitirmeden önce test ederken bu çözümde tökezledim).
Perl ve PCRE regex, 253 bayt, Martin Ender ile işbirliği içinde
Bazı rakamları (muhtemelen 9, 8 veya 7) atlayan daha kısa çözümlerin olabileceğini varsaydım. Martin Ender aşağıda gösterilen birini buldu:
^(?=(.*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
Okunabilir sürüm:
^
(? = (. X 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