ปัญหา
ไม่มีวิธีง่ายๆในการรับการเปลี่ยนแปลงด้วย regex
- การเปลี่ยนแปลง:การเดินทางคำ ( "aabc") ในการสั่งซื้ออื่นโดยไม่มีการเปลี่ยนแปลงจำนวนหรือชนิดของตัวอักษร
- Regex:การแสดงออกปกติ
สำหรับการตรวจสอบ:
- "การเปลี่ยนลำดับ Regex โดยไม่มีการทำซ้ำ"คำตอบจะสร้างรหัส JavaScript แทนการใช้ Regex โดยสมมติว่าสิ่งนี้ง่ายกว่ามาก
- "วิธีหาวิธีเรียงสับเปลี่ยนทั้งหมดของคำที่กำหนดในข้อความที่กำหนด" - คำตอบไม่ได้ใช้ regexes เช่นกัน
- "Regex จับคู่ทั้งหมด {1, 2, 3, 4} โดยไม่มีการทำซ้ำ" - คำตอบนั้นใช้ regexes แต่ก็ไม่สามารถปรับเปลี่ยนได้หรือไม่ง่าย
- คำตอบนี้ยังเรียกร้อง: "นิพจน์ทั่วไปไม่สามารถทำในสิ่งที่คุณขอมันไม่สามารถสร้างพีชคณิตจากสตริง."
วิธีการแก้ปัญหาที่ฉันค้นหา
ควรมีแบบฟอร์ม:
- » aabc « (หรืออะไรก็ได้ที่คุณสามารถใช้วงเล็บเปิดและปิด)
- (aabc)! (คล้ายกับ (abc)? แต่มีสัญลักษณ์อื่นในตอนท้าย)
- [aabc]! (คล้ายกับ [abc] + แต่มีสัญลักษณ์อื่นในตอนท้าย)
ข้อดีของการแก้ปัญหาเหล่านี้
พวกเขาคือ:
- ง่าย
- ปรับตัวได้
- นำมาใช้ใหม่
ทำไมสิ่งนี้ควรมีอยู่
- Regexes เป็นวิธีการอธิบายไวยากรณ์ของภาษาปกติ พวกเขามีพลังเต็มที่ในการเป็นภาษาประจำชนิดใด ๆ
- สมมติว่าภาษาปกติมีพลังเพียงพอสำหรับการเรียงสับเปลี่ยน (พิสูจน์ด้านล่าง) - ทำไมไม่มีวิธีง่าย ๆ ในการถ่ายทอดสิ่งนี้
ดังนั้นคำถามของฉันคือ:
- (ทำไม) หลักฐานของฉันผิด
- ถ้าถูกต้อง: ทำไมไม่มีวิธีง่าย ๆ ในการแสดงการเรียงสับเปลี่ยน?
การพิสูจน์
- นิพจน์ทั่วไปเป็นวิธีหนึ่งในการบันทึกไวยากรณ์ของภาษาปกติ พวกเขาสามารถอธิบายไวยากรณ์ภาษาใด ๆ ปกติ
- อีกวิธีในการอธิบายภาษาปกติใด ๆ (ที่มีจำนวนตัวอักษรที่ จำกัด ภายในตัวอักษรของพวกเขา) ไวยากรณ์เป็น Automatons ที่ไม่ได้กำหนดไว้ (ด้วยจำนวน จำกัด ของรัฐ)
มีจำนวนตัวอักษรที่ จำกัด ฉันสามารถสร้างหุ่นยนต์นี้: (ตัวอย่างเป็นทางการ: ดูด้านล่าง)
ไวยากรณ์ที่ยอมรับการเรียงสับเปลี่ยนของ "abbc":
(เพราะตัวเลขด้านบนอาจมีบางคนรู้วิธีที่จะทำให้ส่วนนี้ดูดีขึ้น)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (ไม่มีการพิมพ์ผิด!
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h¹² -> bb
h²² -> ac
h²² -> แคลิฟอร์เนีย
h²³ -> ab
h²³ -> ba
เป็นทางการมากขึ้น: (ใช้ finite-state-automaton แต่สามารถทำได้ด้วยไวยากรณ์เช่นกัน)
- คำ q (ที่มีความยาว จำกัด ) ซึ่งการเรียงสับเปลี่ยนใด ๆ ควรถึงสถานะที่ยอมรับได้
- X คือตัวอักษรที่ จำกัด
- Set of states S ประกอบด้วยลำดับของตัวอักษรใด ๆ ที่ยาวถึง q (ดังนั้นขนาดของ S จึงมี จำกัด ) บวกหนึ่งสถานะของ "คำที่ยาวกว่า"
- ฟังก์ชั่นการเปลี่ยนสถานะ d ซึ่งใช้ตัวอักษรและย้ายไปยังสถานะที่สอดคล้องกับส่วนที่อ่านในขณะนี้ของคำ
- F คือชุดของสถานะที่เป็นพีชคณิตที่แน่นอนของ q
ดังนั้นจึงเป็นไปได้ที่จะสร้างออโตเมติกอัน จำกัด สำหรับการยอมรับการเรียงสับเปลี่ยนของคำที่กำหนด
ย้ายไปพร้อมกับหลักฐาน
ดังนั้นฉันได้พิสูจน์แล้วว่าภาษาปกติมีอำนาจในการตรวจสอบวิธีการเรียงสับเปลี่ยนใช่ไหม?
เหตุใดจึงไม่มีวิธีเข้าถึงสิ่งนี้ด้วย Regexes มันเป็นฟังก์ชั่นที่มีประโยชน์
^(a()|a()|b()|c()){4}\2\3\4\5$
ดูเหมือนว่าจะใช้งานได้ (ดูregex101.com/r/9URPpg/4/tests )