เป็นการง่ายที่จะอธิบายเครื่องจักรสถานะ จำกัด ที่รับรู้การทวีคูณของ 9: ติดตามผลรวมหลัก (mod 9) และเพิ่มตัวเลขใดก็ตามที่ยอมรับต่อไป FSM เช่นนี้มีเพียง 9 รัฐง่ายมาก! โดยการเทียบเท่าระหว่าง FSM-recognizability และภาษาปกติมีการแสดงออกปกติสำหรับทวีคูณของ 9 อย่างไรก็ตามการแสดงออกปกติดังกล่าวใด ๆ ที่เป็น ... นานมาก ... เช่นเดียวกับในคำสั่งของกิกะไบต์
มีตัวอย่างการทำงานที่https://www.quaxio.com/triple/สำหรับการทวีคูณของ 3 ที่ด้านล่างของหน้าผู้เขียนมีวิธีแก้ปัญหา "มือที่เหมาะที่สุด" ที่สั้นกว่าการแปลงที่ไร้เดียงสาเล็กน้อย FSM เป็น regex
ความท้าทาย:
คุณต้องสร้าง regex เพื่อตรวจสอบทวีคูณของ 9 เนื่องจากคาดว่า regex ดังกล่าวจะยาวมากฉันขอให้คุณจัดเตรียมโปรแกรมที่สามารถพิมพ์ regex ของคุณได้ (หากคุณต้องการให้ regex ทั้งหมดอาจโฮสต์ที่อื่นและเชื่อมโยงที่นี่!)
คุณต้องสามารถบอกจำนวนตัวอักษรที่แน่นอนของผลลัพธ์ของโปรแกรมของคุณได้ดังนั้นให้มีโปรแกรมที่พยายาม regexes ทั้งหมดจนถึงความยาวที่แน่นอนจนกว่าจะพบว่าตัวที่ใช้งานได้นั้นไม่สามารถยอมรับได้เว้นแต่ว่ามันจะเร็วพอที่คุณจะทำได้ เรียกใช้ให้เสร็จสมบูรณ์และให้ความยาว regex กับเรา!
คะแนนสำหรับการมีเอาต์พุต regex ที่สั้นที่สุดไม่ใช่ตามความยาวของโปรแกรมแน่นอน เนื่องจาก regex เป็น "โปรแกรม" ที่ฉันขอและมันยาวเกินไปที่จะส่งที่นี่ฉันจึงยังติดแท็กรหัสกอล์ฟนี้
กฎ:
- ข้อมูลที่ป้อนจะรวมเฉพาะการจับคู่อักขระ
[0-9]*
การป้อนข้อมูลจะรวมเฉพาะการจับคู่ตัวอักษร - regex ของคุณควรตรงกับทวีคูณของ 9 แต่ไม่ใช่อย่างอื่น กรณีที่ไม่มีตัวเลข 0-9 ทั้งหมดและอินพุตที่ไม่ถูกต้องสามารถจับคู่หรือล้มเหลวได้ตามที่คุณต้องการ
- เมื่อพิจารณาถึงแรงจูงใจที่ DFA นั้นจดจำได้ง่าย Regex ที่ได้นั้นต้องเป็นนิพจน์ปกติในศัพท์ทางทฤษฎีมากกว่านั่นคือเฉพาะโอเปอเรเตอร์ที่ปิดภาษาปกติเท่านั้น เพื่อความแม่นยำสิ่งเดียวที่ได้รับอนุญาต:
- ตัวอักษรช่วงตัวอักษร (
[ab]
,[a-f]
,[^k]
) Kleene ดาว (*
), แองเคอ (^
และ$
) การจัดกลุ่มผ่านวงเล็บสลับ (|
) แง่ตัวเลือก (?
) หนึ่งหรือเพิ่มเติมเงื่อนไข (+
) lookaheads ((?=)
) lookaheads ลบ ((?!)
) lookbehinds ((?<=)
), lookbehinds เชิงลบ ((?<!)
), conditionals (ในhttps://www.regular-expressions.info/conditional.html -(?(?=test)then|else)
) และ backreferences ที่มีความยาวที่ถูก จำกัด (ดูด้านล่าง)
- ตัวอักษรช่วงตัวอักษร (
- ตัวอย่างของสิ่งต่าง ๆ ที่ไม่ได้รับอนุญาต:
- การอ้างอิงความยาวโดยพลการอ้างอิงไปข้างหน้าการเรียกซ้ำรูทีนย่อยการวนลูปการสร้างรหัสที่สามารถเรียกใช้งานการเปลี่ยนแปลงใด ๆ ของ 'eval' หรือการสร้างในตัวสำหรับการคัดเลือกสตริงเป็นค่าเลขคณิต
- การตอบกลับที่สามารถแสดงให้เห็นว่ามีสตริงการโยงที่มีความยาวที่ถูกผูกไว้นั้นสามารถยอมรับได้เนื่องจากสามารถเก็บไว้ในสถานะ จำกัด และไม่เปลี่ยนแปลงความสม่ำเสมอของภาษา ยกตัวอย่างเช่น regex ไม่เป็นที่ยอมรับเป็นมีความยาวที่ถูกผูกไว้ในกลุ่มการจับภาพ
(..2.[3-5])4\1.\1
\1
นี่คือการก่อสร้างปกติ การสร้างเช่น(2*)0\1
ไม่สามารถยอมรับได้เนื่องจากกลุ่มที่ถูกจับไม่สามารถเก็บไว้ในสถานะ จำกัด ได้ - regex ของคุณมีอิสระที่จะยอมรับหรือปฏิเสธจำนวนเต็มด้วยเลขศูนย์นำหน้าตามที่คุณต้องการ อย่างไรก็ตาม
"0"
ต้องยอมรับสตริง
^(0|9|(?<c>1|(?<c>2|(?<c>3|(?<c>4|(?<c>5|(?<c>6|(?<c>7|(?<c>8))))))))((?<-c>){9})?)*$(?(c).)