เคล็ดลับสำหรับการเล่นกอล์ฟใน Retina


10

คุณมีเคล็ดลับทั่วไปสำหรับการเล่นกอล์ฟในRetinaอย่างไร ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Retina (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ

สำหรับการอ้างอิงคอมไพเลอร์ออนไลน์เป็นที่นี่

@ SP3000 ชี้ให้เห็นนอกจากนี้ยังมีเคล็ดลับสำหรับการ Regex กอล์ฟ คำตอบที่นี่ควรเน้นเฉพาะในคุณลักษณะของ Retina และไม่เกี่ยวกับเคล็ดลับการเล่นกอล์ฟ regex ทั่วไป



อืมฉันยังคงโพสต์ข้อความนี้เพราะ Retina ยังคงพัฒนาอยู่และฉันกลัวว่าคำตอบส่วนใหญ่จะจบลงด้วยการเป็นเคล็ดลับการเล่นกอล์ฟ regex ธรรมดาไม่เฉพาะเจาะจงกับ Retina แต่เราก็ควรจะไปกันเถอะฉันเดาว่า ... :)
Martin Ender

@ MartinBüttnerคุณและคนอื่น ๆ ให้คำแนะนำและคำแนะนำที่ดีแก่ฉันตั้งแต่ฉันเริ่มมองที่ Retina ดังนั้นฉันคิดว่ามันอาจเกี่ยวกับเวลาสำหรับเรื่องนี้ ฉันได้เพิ่มความกระจ่างว่าเคล็ดลับทั่วไปของ regex ควรไปที่คำถามที่เชื่อมโยง
Digital Trauma

1
@ MartinBüttnerที่นี่เป็นสถานที่ที่ดีเหมือนที่จะถาม - ฉันเคยสงสัยมาพักหนึ่งแล้ว - จากความอยากรู้แรงบันดาลใจของชื่อ "Retina" คืออะไร? ฉันถือว่าส่วน "Re" นั้นใช้สำหรับนิพจน์ปกติ แต่แล้ว "tina" ล่ะ?
Digital Trauma

3
@ DigitalTrauma ฉันพยายามหาคำศัพท์ที่ดีที่จะใช้เป็นตัวย่อ แต่ล้มเหลว คำว่า "เรติน่า" นั้นค่อนข้างใกล้เคียงกับความพยายามบางอย่างและฉันก็ชอบคำนั้น ฉันไม่เคยจัดการซ้ำมันเป็นตัวย่อแม้ว่าและได้รับตั้งแต่นั้น ดังนั้นใช่ "re" นั้นใช้สำหรับ "นิพจน์ทั่วไป" และอาจเป็น "n" สำหรับ ". NET" แต่ท้ายที่สุดมันเป็นเพียงคำที่ฟังดูดี
Martin Ender

คำตอบ:


3

รวมลูปถ้าเป็นไปได้

ในการคำนวณที่ไม่สำคัญคุณมักจะพบว่าตัวเองใช้หลายลูปในการประมวลผลข้อมูล:

+`stage1
+`stage2
+`stage3

ดังนั้นสิ่งนี้จะวิ่งไปstage1เรื่อย ๆ จนกระทั่งเอาท์พุทมาบรรจบกันแล้วstage2จนกระทั่งเอาท์พุทมาบรรจบกันแล้วก็stage3เอาท์พุทมาบรรจบกัน

อย่างไรก็ตามมันก็คุ้มค่าที่จะตรวจสอบรายละเอียดของขั้นตอนต่างๆ บางครั้งอาจเป็นไปได้ที่จะเรียกใช้ลูปในรูปแบบอินเตอร์ลีฟstage1, stage2, stage3, stage1, stage2, stage3, ...แทน (ขึ้นอยู่กับสิ่งที่ขั้นตอนทำจริง ๆ แต่บางครั้งพวกเขาก็เปลี่ยนมุมฉากอย่างสมบูรณ์ ในกรณีนี้คุณสามารถบันทึกไบต์โดยล้อมรอบเป็นวงเดียว:

{`stage1
stage2
}`stage3

หากstage1เป็นระยะแรกหรือstage3เป็นระยะสุดท้ายของโปรแกรมคุณสามารถละเว้นวงเล็บเหล่านั้นได้เช่นกัน (ซึ่งหมายความว่านี่สามารถบันทึกไบต์สำหรับการวนซ้ำสองขั้นได้)

การใช้เทคนิคนี้เมื่อไม่นานมานี้สามารถเห็นได้ในคำตอบนี้


2

แยกสตริงออกเป็นชิ้น ๆ ที่มีความยาวเท่ากัน n

ในภาษา "ปกติ" ส่วนใหญ่ TMTOWTDI (มีมากกว่าหนึ่งวิธีในการทำ) ฉันสมมติว่าที่นี่อินพุตไม่ประกอบด้วย linefeeds และ "การแยก" หมายถึงการแยกมันออกเป็นเส้น แต่มีเป้าหมายที่แตกต่างกันสองประการ: ถ้าความยาวของสตริงไม่ใช่ความยาวหลายอันคุณต้องการเก็บอันต่อท้ายที่ไม่สมบูรณ์หรือคุณต้องการทิ้งมันหรือไม่?

การรักษาส่วนต่อท้ายที่ไม่สมบูรณ์

โดยทั่วไปมีสามวิธีในการแยกใน Retina ฉันกำลังนำเสนอวิธีการทั้งสามที่นี่เพราะพวกเขาอาจสร้างความแตกต่างที่ใหญ่กว่าเมื่อคุณพยายามที่จะปรับให้เข้ากับปัญหาที่เกี่ยวข้อง คุณสามารถใช้การแทนที่และผนวก linefeed เข้ากับการแข่งขันแต่ละรายการ:

.{n}
$&¶

นั่นเป็น 8 ไบต์ (หรือน้อยไปนิดถ้าn = 2หรือn = 3แล้วเพราะคุณสามารถใช้..หรือ...ตามลำดับ) นี่เป็นปัญหาหนึ่ง: มันผนวก linefeed เพิ่มเติมหากความยาวสตริงเป็นความยาวหลายอัน

คุณยังสามารถใช้สเตจแยกและใช้ประโยชน์จากข้อเท็จจริงที่ว่าการดักจับเก็บไว้ในสปลิต:

S_`(.{n})

_ตัวเลือกเอาบรรทัดว่างที่อาจจะเกิดขึ้นจากการที่ครอบคลุมสตริงทั้งหมดที่มีการแข่งขัน นี่คือ 9 ไบต์ แต่ไม่ได้เพิ่ม linefeed ต่อท้าย สำหรับn = 3มัน 8 ไบต์และn = 2มัน 7 ไบต์ โปรดทราบว่าคุณสามารถบันทึกหนึ่งไบต์โดยรวมถ้าบรรทัดว่างเปล่าไม่ได้เรื่อง (เช่นเพราะคุณจะได้รับการประมวลผลสายไม่ว่างเปล่าและการกำจัด linefeeds ในภายหลังต่อไป) _แล้วคุณสามารถเอา

ตัวเลือกที่สามคือการใช้การแข่งขัน ด้วย!ตัวเลือกที่เราสามารถพิมพ์การแข่งขันทั้งหมด อย่างไรก็ตามหากต้องการรวมส่วนต่อท้ายเราจำเป็นต้องอนุญาตให้มีความยาวการจับคู่ตัวแปร:

M!`.{1,n}

นี่คือ 9 ไบต์และจะไม่รวมการป้อนบรรทัดต่อท้าย นี้ก็จะกลายเป็น 8 ไบต์โดยการทำn = 3 ..?.?อย่างไรก็ตามทราบว่าลดไป6ไบต์เพราะตอนนี้เราจะต้องn = 2 ..?นอกจากนี้โปรดทราบว่าMสามารถลดลงได้หากนี่เป็นขั้นตอนสุดท้ายในโปรแกรมของคุณโดยบันทึกหนึ่งไบต์ในทุกกรณี

ทิ้งชิ้นส่วนต่อท้ายที่ไม่สมบูรณ์

สิ่งนี้จะใช้เวลานานมากถ้าคุณพยายามที่จะแทนที่ด้วยเพราะคุณต้องเปลี่ยนชิ้นส่วนต่อท้ายด้วยไม่มีอะไร (ถ้ามี) และแบ่งด้วย ดังนั้นเราสามารถเพิกเฉยได้อย่างปลอดภัย ที่น่าสนใจสำหรับวิธีการจับคู่มันตรงกันข้าม: มันสั้นลง:

M!`.{n}

นั่นเป็น 7 ไบต์หรือน้อยกว่าสำหรับ,n = 2 n = 3อีกครั้งโปรดทราบว่าคุณสามารถละเว้นMถ้านี่คือขั้นตอนสุดท้ายในรหัส

หากคุณต้องการให้ป้อนบรรทัดต่อท้ายที่นี่คุณสามารถรับได้โดยผนวก|$เข้ากับ regex

โบนัส: ชิ้นส่วนที่ทับซ้อนกัน

โปรดจำไว้ว่าMมี&ตัวเลือกที่ส่งคืนการจับคู่ที่ซ้อนทับกัน (ซึ่งโดยทั่วไปจะไม่สามารถใช้ regex ได้) สิ่งนี้ช่วยให้คุณได้รับชิ้นส่วนที่ทับซ้อนกันทั้งหมด (สตริงย่อย) ของสตริงที่มีความยาวที่กำหนด:

M!&`.{n}

เป็นไปได้ไหมที่จะแบ่งสตริงออกครึ่งหนึ่งด้วยความยาวผันแปรได้หรือไม่? ดังนั้น123456จะกลายเป็น123\n456และ1234567890กลายเป็น12345\n67890?
Kevin Cruijssen

1
@KevinCruijssen ฉันไม่คิดว่าฉันจะเพิ่มคุณสมบัติเฉพาะสำหรับสิ่งนั้น คุณอาจจะต้องใช้กลุ่มสมดุล: tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//...?=หากคุณไม่ทราบเลื่อนบรรทัดต่อท้ายคุณสามารถละเว้น
Martin Ender

ฉันสามารถทำสิ่งที่ท้าทายที่ฉันคิดว่าฉันต้องการมันแตกต่างกันไป แต่กลุ่มที่สมดุลนั้นมีประโยชน์มากจริง ๆ ! ฉันรู้ว่ามันต้องมีอะไรบางอย่างในสายเหล่านั้น แต่ทักษะ regex / Retina ของฉันยังไม่ดีพอ ขอบคุณสำหรับคำตอบ! :)
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.