ปัญหา
ฉันมีสำนวนปกติที่ต้องใช้ในบางโค้ด แต่ฉันใช้ภาษาการเขียนโปรแกรมที่ไม่รองรับ regex! โชคดีที่ฉันรู้ว่าสตริงทดสอบจะมีความยาวสูงสุดและจะประกอบด้วย ASCII ที่พิมพ์ได้เท่านั้น
ความท้าทาย
คุณต้องป้อน regex และตัวเลขn
และส่งออกทุกสตริงที่ประกอบด้วย ASCII ที่พิมพ์ได้ (รหัส ASCII 32 ถึง 126 รวมถึง
~
ไม่มีแท็บหรือบรรทัดใหม่) ที่มีความยาวน้อยกว่าหรือเท่ากับn
ที่ตรงกับ regex นั้น คุณไม่สามารถใช้นิพจน์ทั่วไปหรือฟังก์ชันจับคู่ regex ในรหัสของคุณได้เลย นิพจน์ทั่วไปจะถูก จำกัด ดังต่อไปนี้:
- ตัวอักษรตัวอักษร (และหนีออกมาซึ่งบังคับให้ตัวละครที่จะเป็นตัวอักษรเพื่อให้
\.
เป็นตัวอักษร.
,\n
เป็นตัวอักษรn
(เทียบเท่าเพียงn
) และ\w
เทียบเท่ากับw
. คุณไม่จำเป็นต้องลำดับการสนับสนุนการหลบหนี.) .
- อักขระตัวแทน (อักขระใด ๆ )- คลาสอักขระ
[abc]
หมายถึง "a หรือ b หรือ c" และ[d-f]
หมายถึงอะไรตั้งแต่ d ถึง f (เช่น d หรือ e หรือ f) ตัวละครเดียวที่มีความหมายพิเศษในคลาสตัวละครคือ[
และ]
(ซึ่งจะถูกหลบหนีอยู่เสมอดังนั้นไม่ต้องกังวลเกี่ยวกับสิ่งเหล่านั้น),\
(ตัวหนีของหลักสูตร)^
ที่จุดเริ่มต้นของคลาสตัวละคร (ซึ่งเป็นการปฏิเสธ ) และ-
(ซึ่งเป็นช่วง) |
- ตัวดำเนินการ OR การสลับfoo|bar
วิธีการอย่างใดอย่างหนึ่งfoo
หรือbar
และ(ab|cd)e
การแข่งขันอย่างใดอย่างหนึ่งหรือabe
cde
*
- จับคู่โทเค็นก่อนหน้านี้ซ้ำเป็นศูนย์หรือมากกว่านั้นโลภ (พยายามทำซ้ำหลาย ๆ ครั้งเท่าที่จะทำได้)+
- ทำซ้ำอย่างน้อยหนึ่งครั้งโลภ?
- ศูนย์หรือหนึ่งครั้ง- การจัดกลุ่มที่มีวงเล็บเพื่อราชสกุลกลุ่ม,
|
, หรือ*
+
?
อินพุต regex นั้นจะถูกต้องเสมอ (เช่นคุณไม่ต้องจัดการกับอินพุต?abc
หรือ(foo
หรืออินพุตที่ไม่ถูกต้อง) คุณสามารถส่งออกสตริงในลำดับใดก็ได้ที่คุณต้องการ แต่แต่ละสตริงจะต้องปรากฏเพียงครั้งเดียว (ไม่ส่งออกรายการที่ซ้ำกัน)
กรณีทดสอบ
การป้อนข้อมูล: .*
, 1
เอาท์พุท: (สตริงว่าง) ,
!
, "
, ... }
,~
อินพุต: w\w+
, 3
เอาต์พุต: ww
,www
การป้อนข้อมูล: [abx-z][^ -}][\\]
, 3
เอาท์พุท: a~\
, b~\
, x~\
, y~\
,z~\
การป้อนข้อมูล: ab*a|c[de]*
, 3
เอาท์พุท: c
, cd
, ce
, aa
, cde
, ced
, cdd
, cee
,aba
การป้อนข้อมูล: (foo)+(bar)?!?
, 6
เอาท์พุท: foo
, foo!
, foofoo
,foobar
การป้อนข้อมูล: (a+|b*c)d
, 4
เอาท์พุท: ad
, cd
, aad
, bcd
, aaad
,bbcd
อินพุต: p+cg
, 4
เอาต์พุต: pcg
,ppcg
อินพุต: a{3}
, 4
เอาต์พุต:a{3}
ผู้ชนะ
นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ!
|
สมเหตุสมผลน้อยมาก a|b|c
มันดูเหมือนจะไม่จัดการกับกลุ่มที่ซ้อนกันหรือ มีอะไรผิดปกติกับการใช้คำอธิบายมาตรฐานในแง่ของวิธีการเรียงต่อกันอย่างมากและการผูกสลับ (และคุณไม่มีข้อแก้ตัวที่ไม่ได้ใช้กล่องทราย)