ฉันต้องการลองความท้าทายกอล์ฟ regex รูปแบบใหม่ซึ่งขอให้คุณแก้ปัญหาการคำนวณแบบไม่ย่อยโดยไม่มีอะไรนอกจากการทดแทน regex เพื่อให้เป็นไปได้มากขึ้นและน้อยลงของงานบ้านคุณจะได้รับอนุญาตให้ใช้การทดแทนหลายอย่างหนึ่งหลังจากที่อื่น
ความท้าทาย
เราจะเริ่มต้นง่าย: กำหนดสตริงที่มีจำนวนเต็มบวกสองจำนวนโดยที่ตัวเลขทศนิยมคั่นด้วย a ,
สร้างสตริงที่มีผลรวมของพวกเขาเช่นเดียวกับเป็นทศนิยม ดังนั้นง่ายมาก
47,987
ควรเปลี่ยนเป็น
1034
คำตอบของคุณควรใช้กับจำนวนเต็มบวกโดยพลการ
รูปแบบ
ทุกคำตอบควรเป็นลำดับของขั้นตอนการทดแทนแต่ละขั้นตอนประกอบด้วย regex และสตริงการแทนที่ เป็นทางเลือกสำหรับแต่ละขั้นตอนเหล่านี้ในลำดับคุณอาจเลือกที่จะทำซ้ำการทดแทนจนกว่าสตริงจะหยุดการเปลี่ยนแปลง นี่คือตัวอย่างการส่ง (ซึ่งไม่ได้แก้ปัญหาข้างต้น):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
รับอินพุต123,456
การส่งนี้จะประมวลผลอินพุตดังนี้: การทดแทนแรกจะถูกใช้เพียงครั้งเดียวและให้ผลลัพธ์:
|123,|456
ตอนนี้การทดแทนที่สองถูกนำไปใช้ในการวนซ้ำจนกว่าสตริงจะหยุดการเปลี่ยนแปลง
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
และสุดท้ายการทดแทนที่สามจะถูกนำมาใช้ครั้งเดียว:
111111
โปรดทราบว่าเกณฑ์การเลิกจ้างสำหรับลูปคือการเปลี่ยนแปลงสตริงหรือไม่ไม่ว่า regex จะพบการจับคู่หรือไม่ (นั่นคือมันอาจสิ้นสุดหากคุณพบคู่ที่ตรงกัน แต่การแทนที่นั้นเหมือนกับการแข่งขัน)
เกณฑ์การให้คะแนน
คะแนนหลักของคุณคือจำนวนขั้นตอนการเปลี่ยนตัวในการส่งของคุณ การทดแทนซ้ำทุกครั้งจะนับเป็น10ขั้น 1 + 10 + 1 = 12
ดังนั้นตัวอย่างข้างต้นจะให้คะแนน
ในกรณีของการเสมอ (ไม่น่าจะเกินไป) คะแนนรองคือผลรวมของขนาดของทุกขั้นตอน สำหรับแต่ละขั้นตอนให้เพิ่ม regex ( ไม่มีตัวคั่น) ตัวดัดแปลงและสตริงการแทนที่ (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
สำหรับตัวอย่างข้างต้นนี้จะเป็น
กฎเบ็ดเตล็ด
คุณสามารถใช้รสชาติของ regex ใดก็ได้ (ซึ่งคุณควรระบุ) แต่ทุกขั้นตอนต้องใช้รสชาติเดียวกัน นอกจากนี้คุณจะต้องไม่ใช้คุณสมบัติใด ๆ ของภาษาโฮสต์ของ flavour เช่น callbacks แทนหรือโมดิe
ฟายเออร์ของ Perl ซึ่งประเมินโค้ด Perl การจัดการทั้งหมดจะต้องเกิดขึ้นเฉพาะผ่านการทดแทน regex
โปรดทราบว่ามันขึ้นอยู่กับรสชาติและตัวดัดแปลงของคุณว่าการแทนที่แต่ละครั้งจะแทนที่การเกิดขึ้นทั้งหมดหรือเพียงครั้งเดียวเท่านั้น เช่นถ้าคุณเลือก ECMAScript รสขั้นตอนเดียวโดยค่าเริ่มต้นจะแทนที่เพียงหนึ่งครั้งเท่านั้นยกเว้นว่าคุณใช้g
ตัวแก้ไข ในทางตรงกันข้ามถ้าคุณใช้. NET รสแต่ละขั้นตอนจะแทนที่ทุกสิ่งที่เกิดขึ้น
สำหรับภาษาที่มีวิธีการทดแทนที่แตกต่างกันสำหรับการแทนที่แบบเดี่ยวและแบบโกลบอล (เช่น Ruby's sub
vs. gsub
) ให้สมมติว่าการแทนที่แบบเดี่ยวเป็นค่าเริ่มต้นและจัดการการแทนที่แบบโกลบอลเช่นg
ตัวดัดแปลง
การทดสอบ
หากรสชาติที่คุณเลือกเป็น. NET หรือ ECMAScript คุณสามารถใช้Retinaเพื่อทดสอบการส่งของคุณ สำหรับรสชาติอื่น ๆ คุณอาจจะต้องเขียนโปรแกรมขนาดเล็กในภาษาโฮสต์ซึ่งใช้การทดแทนตามลำดับ หากคุณมีโปรดระบุโปรแกรมทดสอบนี้ในคำตอบของคุณ