ทำโพลิกอน regex


19

เขียน regex ที่ทำงานในอย่างน้อย 2 รสชาติ regex (หรือเวอร์ชัน) และจับคู่สตริงที่แตกต่างกันในแต่ละรส (หรือรุ่น) ที่ทำงานอยู่

สตริงที่จะจับคู่ในการท้าทายนี้เป็นคำแรกของชื่อรหัส Ubuntu ซึ่งแสดงอยู่ด้านล่าง regex ของคุณต้องตรงกันจากด้านบนของรายการ นั่นคือถ้างานของคุณ regex 3 รสชาติก็มีการแข่งขันWarty HoaryและBreezyและคนอื่นไม่ได้

Warty
Hoary
Breezy
Dapper
Edgy
Feisty
Gutsy
Hardy
Intrepid
Jaunty
Karmic
Lucid
Maverick
Natty
Oneiric
Precise
Quantal
Raring
Saucy
Trusty
Utopic
Vivid
Wily
Xenial
Yakkety
Zesty
17.10
18.04
18.10
19.04
19.10
...

หาก regex ของคุณทำงานได้มากกว่า 26 รสชาติคุณสามารถจับคู่หมายเลขรุ่น Ubuntu ได้ เริ่มต้นจาก 17.10 สำหรับรสชาติใหม่แต่ละรายการให้เปลี่ยนหมายเลขที่สองเป็น 10 หากเป็น 04 และเพิ่มจำนวนที่หนึ่งและเปลี่ยนที่สองเป็น 04

ในแต่ละรสชาติ regex ของคุณควรจับคู่เฉพาะสตริงที่ควรและไม่มีอะไรอื่น (ไม่ จำกัด เฉพาะชื่อรหัส) การขึ้นบรรทัดใหม่ไม่สำคัญ นั่นหมายความว่า regex ของคุณสามารถจับคู่สตริงเท่านั้นโดยไม่ขึ้นบรรทัดใหม่ต่อท้ายจับคู่เฉพาะสตริงที่มีบรรทัดใหม่ต่อท้ายหรือจับคู่ทั้งคู่ และไม่จำเป็นต้องสอดคล้องในรสชาติที่แตกต่างกัน คุณสามารถสันนิษฐานว่าอินพุตอยู่ใน ASCII ที่พิมพ์ได้ (ยกเว้นบรรทัดใหม่ต่อท้ายหากมี)

คะแนนของคุณคือ (ความยาวของรหัส + 10) / ((จำนวนรสชาติ) ^ 2) คะแนนต่ำสุดชนะ


1
เพียงเพื่อตรวจสอบ - โดย "ในแต่ละรสชาติ regex ของคุณควรตรงกับสตริงที่ควรและไม่มีอะไรอื่น" นี่หมายความว่าแต่ละ regex ควรตรงกับชื่อรุ่น Ubuntu หนึ่งชื่อเท่านั้นและไม่มีชื่ออื่น ๆ ชื่อสตริงหรือหมายความว่า regex สามารถจับคู่สตริงนั้นและไม่มีสตริงอื่น ๆ แม้ว่าจะไม่ใช่ชื่อรุ่นในรายการด้านบนหรือไม่
Sp3000

@ Sp3000 มันควรจะตรงกับสายที่แน่นอนและไม่มีสายอื่น ๆ
jimmy23013

คำตอบ:


24

87 ไบต์, 5 รสชาติ, (87 + 10) / 25 = 3.88

^(((?=W)[[:word:]&&]art|Ho(?=a)\ar|Bre(?=ez)[]e]\z|E(?=dg)[[d]]g)y|(?=Da)[D-[E]]apper)$

ตอนนี้ฉันได้ลองชิมรสง่าย ๆ แล้วซึ่งก็คือ:

โครงสร้างทั่วไปคือ ^((...)y|...)$แยกออกจากส่วนท้ายyและเพิ่มจุดยึด

Warty (PCRE)

(?=W)[[:word:]&&]art

ใน PCRE และ Ruby [[:word:]]เป็นคลาสอักขระ POSIX ที่ตรงกับอักขระคำ - ในรสชาติอื่น ๆ ที่คุณได้รับ[[:word:]คลาสอักขระตามตัวอักษร&&]ซึ่งล้มเหลวในการ(?=W)ยืนยัน หากต้องการทำให้ Ruby ล้มเหลว&&ใช้เพื่อตัดคลาส POSIX โดยที่ไม่มีอะไรเลยในขณะที่ PCRE &&ไม่มีความหมายพิเศษ

Hoary (Javascript)

Ho(?=a)\ar

ไม่ว่าด้วยเหตุผลใดก็ตาม Javascript เป็นเพียงรสชาติเดียวเท่านั้น \aเป็นตัวอักษรและมีaรสชาติอื่น ๆ ที่ตรงกับตัวอักษรระฆัง (ASCII 7)

สดชื่น (Python)

Bre(?=ez)[]e]\z

ใน Python และ Javascript \zนั้นเป็นตัวอักษรz- ในรสชาติอื่น ๆ มันเทียบเท่ากับ$จุดสิ้นสุดของจุดยึดสตริง ในการทำให้ Javascript ล้มเหลวเราใช้คลาสถ่าน[]e]ซึ่งเป็นคลาสถ่านเปล่า[]ตามตัวอักษรe]ใน Javascript และคลาสสองชาร์[]e]ใน Python

Dapper (. NET)

(?=Da)[D-[E]]apper

ใน.NET, [D-[E]]ความแตกต่างชุดถอดชุดจาก[E] [D]ใน PCRE, Javascript และ Python เรามีชั้นเรียนแล้วตัวอักษร[D-[E] ]รูบี้แตกต่างกันเล็กน้อย แต่ด้วยเหตุผลบางอย่างมันแยกวิเคราะห์เป็นชั้นเรียน[D-[E]]ที่ตรงเท่านั้นEและฉันยังไม่ได้คิดออกว่าทำไม ...

Edgy (Ruby)

E(?=dg)[[d]]g

ทับทิมช่วยให้การเรียนถ่านภายในชั้นเรียนถ่านเพื่อให้[[d]]เป็นจริงเท่ากับหรือเพียงแค่[d] dในรสชาติอื่น ๆ เรามีแล้วตัวอักษร[[d]]

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