คำถามนี้จะขึ้นอยู่กับสิ่งที่ฉันขึ้นมาด้วยที่จะตอบคำถามอื่น
บางครั้งคำถามที่นี่ขอให้วาดศิลปะ ASCII บางส่วน หนึ่งในวิธีที่ง่ายในการจัดเก็บข้อมูลสำหรับศิลปะเป็นRLE (การเข้ารหัสวิ่งยาว) ดังนั้น:
qqqwwwwweeerrrrrtttyyyy
กลายเป็น:
3q5w3e5r3t4y
ตอนนี้เพื่อวาด ASCII ขนาดใหญ่ที่คุณอาจได้รับข้อมูลเช่นนี้ (ไม่สนใจอักขระบรรทัดใหม่):
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
อักขระที่ใช้สำหรับศิลปะ ASCII จะไม่เป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่หรือตัวเลขเพียงเครื่องหมายเครื่องหมายและสัญลักษณ์ แต่จะอยู่ในชุดอักขระ ASCII ที่พิมพ์ได้เสมอ
คุณต้องการประหยัดพื้นที่ในสตริงนั้นดังนั้นคุณจึงแทนที่ตัวเลขด้วยชุดอักขระตัวพิมพ์ใหญ่ (เป็น 'A' เท่ากับ 1, 'B' เท่ากับ 2 จนกระทั่ง 'Z' เท่ากับ 26) เพราะคุณจะไม่เคยไป ได้รับมากกว่า 26 ซ้ำของตัวละคร ดังนั้นคุณจะได้รับ:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
และในที่สุดคุณก็สังเกตเห็นว่าบางกลุ่มของ (ตัวอักษร + สัญลักษณ์) กำลังทำซ้ำดังนั้นคุณจึงแทนที่กลุ่มที่ปรากฏ 3 ครั้งขึ้นไปในสตริงด้วยชุดอักขระตัวพิมพ์เล็กตามลำดับหรือลักษณะที่ปรากฏในสตริง แต่เก็บไว้ในบัฟเฟอร์ การแทนที่ที่เกิดขึ้น (ในรูปแบบ "กลุ่ม + การแทนที่ถ่าน" สำหรับการทดแทนแต่ละครั้ง) และปล่อยให้ส่วนที่เหลือของสตริงตามที่เป็นอยู่ ดังนั้นกลุ่มต่อไปนี้:
S, (3 times)
T (4 times)
K@ (3 times)
ได้รับการแทนที่ด้วย 'a', 'b' และ 'c' ตามลำดับเนื่องจากจะไม่มีการทำซ้ำมากกว่า 26 กลุ่ม ดังนั้นในที่สุดคุณจะได้รับ:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[ขั้นตอนสุดท้ายบันทึกเพียง 1 ไบต์เนื่องจากกลุ่มที่บันทึกอักขระจริงหลังจากถูกแทนที่คือกลุ่มที่ปรากฏขึ้น 4 ครั้งหรือมากกว่า]
ความท้าทาย
รับสตริงที่มีข้อมูล RLE เพื่อวาดรูป ASCII (โดยมีข้อ จำกัด ที่เสนอ) เขียนโปรแกรม / ฟังก์ชัน / วิธีที่สั้นที่สุดที่คุณสามารถทำได้เพื่อบีบอัดตามที่อธิบายไว้ อัลกอริทึมต้องพิมพ์ / ส่งคืนสองสาย: อันแรกที่มีพจนานุกรมที่ใช้สำหรับการบีบอัดและอันที่สองเป็นสายอักขระการบีบอัดผลลัพธ์ คุณสามารถส่งคืนสตริงเป็น Tuple, array, List หรืออะไรก็ตามตามลำดับที่กำหนด
โปรดทราบว่าหากสตริงไม่สามารถบีบอัดได้ในขั้นตอนที่ 2 อัลกอริทึมจะต้องส่งคืนสตริงว่างเปล่าเป็นค่าส่งคืนแรกและผลลัพธ์ของขั้นตอนที่ 1 เป็นค่าส่งคืนที่สอง
คุณไม่จำเป็นต้องรวมผลลัพธ์ของขั้นตอนที่ 1 ในค่าเอาท์พุทฉันรวมไว้ในตัวอย่างเพื่อวัตถุประสงค์ในการชี้แจง
นี่คือcode-golfดังนั้นคำตอบที่สั้นที่สุดสำหรับแต่ละภาษาอาจชนะ!
อีกกรณีทดสอบ
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
S,aT bK@c
อาจถูกเก็บไว้S,T K@
โดยไม่มีการตั้งชื่ออักขระการแทนที่ซึ่งสามารถอนุมานได้เล็กน้อยจากนั้น