Perl และ PCRE regex, 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) ตามที่เขียนดังนั้นจึงไม่มีประสิทธิภาพอย่างไม่น่าเชื่อ วิธีที่ง่ายที่สุดในการทดสอบคือการแทนที่ทุกเหตุการณ์ที่เกิดขึ้น.*
ด้วย.*?
ซึ่งทำให้กรณีที่ตรงกับที่จะตรวจสอบก่อน (หมายความว่ามันตรงกับในเวลาเชิงเส้น แต่ยังคงใช้เวลาชี้แจงถ้ามันไม่ตรงกับ)
แนวคิดพื้นฐานคือเราบังคับความยาวของ regex ให้เท่ากับ 280 และใช้ lookahead assertions เพื่อบังคับให้ตัวละครแต่ละตัวใน regex ปรากฏอย่างน้อยจำนวนหนึ่งครั้งเช่น(?=(.*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 ดังนั้นเราจึงไม่มีตัวอักษร "พิเศษ" เกิดขึ้น
นี่คือตัวอย่างการเขียนโปรแกรมของautogramประโยคที่อธิบายตัวเองโดยแสดงหมายเลขของอักขระแต่ละตัวที่มี (และในกรณีนี้รวมถึงความยาวทั้งหมดด้วย) ฉันโชคดีที่ได้สร้างมันขึ้นมา (โดยปกติคุณต้องใช้กำลังดุร้าย แต่ฉันสะดุดในวิธีแก้ปัญหานี้ในขณะที่ทดสอบโปรแกรมกำลังเดรัจฉานก่อนที่ฉันจะเขียนเสร็จ)
Perl และ PCRE regex ขนาด 253 ไบต์โดยความร่วมมือกับ Martin Ender
ฉันตั้งสมมติฐานว่าอาจมีวิธีแก้ปัญหาที่สั้นกว่าซึ่งไม่ใช้ตัวเลขบางตัว (น่าจะเป็น 9, 8, หรือ 7) Martin Ender พบหนึ่งดังแสดงด้านล่าง:
^(?=(.*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
รุ่นที่อ่านได้:
^
(? = (. * 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