ผกผันของดอกเบี้ยทบต้น


9

Koronkorkoเป็นคำภาษาฟินแลนด์ที่ให้ความสนใจทบต้น เราไม่ต้องการความสนใจแบบรวมในสายของเราดังนั้นให้หานิพจน์ปกติที่สั้นที่สุดที่เป็นไปได้เพื่อแยกออก

กำหนดสตริงประกอบด้วยเฉพาะของตัวอักษรตัวพิมพ์ใหญ่ AZ, KORONKORKOตรวจสอบการแสดงออกปกติที่สั้นที่สุดที่ตรงกับสายถ้ามันไม่ได้มีอักขระย่อย สตริงใด ๆ ที่มีKORONKORKOเป็นสตริงย่อยไม่ควรจับคู่โดย regex

เพียง แต่ตัวละครA- Z, [, ], -, ^, , ?, *, +, |, (และ)ควรจะใช้ในการแสดงออก

ฉันคิดว่าสิ่งนี้สามารถทำได้กับ 118 ตัวอักษรในการแสดงออก คุณทำให้มันสั้นลงได้ไหม

หมายเหตุ: ความท้าทายนี้มาจากOhjelmointiputka (เป็นภาษาฟินแลนด์)


ถ้า!เป็นตัวละครที่ได้รับอนุญาตคุณสามารถทำได้^((?!KORONKORO).)*$ถึง 19 ไบต์
Mama Fun Roll

3
@ MamaFunRoll ฉันคิดว่านั่นเป็นสาเหตุที่ !ไม่อนุญาต
Alex A.

ฉันสนุกกับการพยายามหาทางไปยังไซต์ของฟินแลนด์และฉันเชื่อว่าสิ่งที่คุณกำลังมองหาคือนิพจน์ทางทฤษฎีที่ตรงกับ / ปฏิเสธสตริงป้อนข้อมูล ตัวอย่างเช่นไซต์ดูเหมือนว่าจะอนุญาตให้ใช้-และ^ภายในคลาสอักขระเท่านั้น (จึง^ไม่สามารถใช้เป็นจุดยึด) และการจับคู่จะนับเฉพาะเมื่อสตริงทั้งหมดถูกจับคู่โดย regex (เช่นการล้อมรอบโดยปริยาย^$เช่น ตรงข้ามกับ "regexes" ปกติซึ่งนับสตริงเป็นการจับคู่หากส่วนใดส่วนหนึ่งของมันตรงกับ regex)
Sp3000

เช่นนี้ฉันได้ลบคำตอบ PCRE ของฉันซึ่งในขณะที่มันควรจะทำงานได้แม้กระทั่งใน PHP ก็แทบจะไม่ได้ตั้งใจในกรณีนี้
Sp3000

ฉันลืมที่จะบอกว่าเว็บไซต์ตรวจสอบว่าการแสดงออกที่ถูกต้องโดยฟังก์ชั่น ereg ของ PHP ได้มีการกล่าวในการอภิปรายในohjelmointiputka.net/keskustelu/…
แขกผู้มาเยือน

คำตอบ:


6

204 ตัวอักษร

(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?[^KO]|[^KR])|[^KO])|[^K])|[^KN])|[^KO])|[^KR])|[^KO])|[^K])*(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?)?)?)?)?)?)?)?)?

สร้างโดยการเปลี่ยน.*KORONKORKO.*เป็นเครื่องสถานะ จำกัดเปลี่ยนเครื่องสถานะ จำกัด และเปลี่ยนกลับเป็น regex


ทำไมนี่จึงเป็นคำตอบที่ดีที่สุด
Bálint

1

Python, 77 79 97 118 ไบต์

แก้ไข 3: เขียนซ้ำ ใช้ lookaheads ที่ซ้อนกัน

^([^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^O]|O(?=$|[^N]|N(?=$|[^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^K]|K(?=$|[^O]))))))))))*$

Regex 101

แก้ไข 2:เพิ่ม '$ |' ตลอด regex ตอนนี้ถ้าคำนำหน้าของ KORONKORKO ถูกจับคู่แล้วรายการถัดไปที่จะจับคู่คือจุดสิ้นสุดของสตริงอักขระที่สิ้นสุดคำนำหน้าหรืออักขระที่ขยายคำนำหน้าถ้ามีบางสิ่งที่ลงท้ายด้วยคำนำหน้า

regex นี้ใช้งานได้re.fullmatch()ซึ่งถูกเพิ่มใน Python 3.4 ที่จะใช้กับre.match(), ^และ$จำเป็นที่จะต้องถูกเพิ่มไปยังจุดเริ่มต้นและจุดสิ้นสุดของรูปแบบตามลำดับสำหรับ 2 ไบต์

([^K]|K($|[^O]|O($|[^R]|R($|[^O]|O($|[^N]|N($|[^K]|K($|[^O]|O($|[^R]|R($|[^K]|K($|[^O]))))))))))*

ลิงก์ Regex101

โซลูชันที่ไม่ถูกต้องก่อนหน้านี้(ดูความคิดเห็น):

K|([^K]|K([^O]|O([^R]|R([^O]|O([^N]|N([^K]|K([^O]|O([^R]|R([^K]|K[^O])))))))))*

แก้ไข:เพิ่ม K เดียว


2
ฉันไม่เชื่อว่าการแข่งขันKนี้
orlp

@orip - จับได้ดี แก้ไขแล้ว.
RootTwo

การอัปเดตล่าสุดล้มเหลวในวันนี้KKORONKORKO
Sp3000

มันแน่นอนหรือไม่ ความคิดใด ๆ
RootTwo

1
ไม่จำเป็นต้องเริ่มต้น^และสิ้นสุด $นอกจากนี้=และ$ไม่ได้รับอนุญาต
LegionMammal978
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.