การใช้เวลาบนไซต์นี้ฉันได้มาสนุกกับสิ่งต่าง ๆ ที่สั้นที่สุด นั่นอาจเป็นเหตุผลว่าทำไมเมื่อเร็ว ๆ นี้ฉันรู้สึกไม่พอใจกับสตริงที่มีตัวละครเดียวกันมากกว่าหนึ่งครั้ง งานของคุณคือการเขียนฟังก์ชั่นหรือโปรแกรมที่ควบแน่นสตริงที่กำหนดตามกฎต่อไปนี้:
เริ่มต้นด้วยการควบแน่น 0ซึ่งจะมองหาคู่แรก (ซ้ายสุด) ของอักขระเดียวกันโดยมี 0 อักขระอื่น ๆ อยู่ระหว่างพวกเขา หากพบคู่ดังกล่าวให้ลบหนึ่งในสองตัวอักษรและเริ่มอัลกอริทึมใหม่โดยดำเนินการควบแน่น 0อีกครั้ง หากไม่พบคู่ดังกล่าวให้ทำตามขั้นตอนต่อไป ตัวอย่าง:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
จากนั้นดำเนินการควบแน่นที่ 1ซึ่งจะค้นหาคู่แรกของอักขระเดียวกันโดยมีอักขระอีก 1 ตัวอยู่ระหว่างกัน หากคู่ดังกล่าวจะพบว่าหนึ่งลบของพวกเขาและทุกตัวอักษรระหว่างพวกเขาและเริ่มต้นใหม่กับ0 การควบแน่น หากไม่พบคู่ดังกล่าวให้ทำตามขั้นตอนต่อไป ตัวอย่าง:
abacac
-C1->acac
java
-C1->ja
ดำเนินการต่อด้วยการควบแน่น 2 ครั้งและอื่น ๆ จนถึงการควบแน่นแบบnโดยที่nคือความยาวของสตริงเดิมทุกครั้งที่เริ่มการทำงานใหม่หลังจากการควบแน่นได้นำตัวอักษรบางตัวออก ตัวอย่าง:
programing
-C2->praming
abcdafg
-C3->afg
สตริงผลลัพธ์ถูกเรียกย่อและมีอักขระแต่ละตัวมากที่สุด
การป้อนข้อมูล:
สตริงตัวพิมพ์เล็กของอักขระ ASCII ที่พิมพ์ได้
เอาท์พุท:
ข้นสตริงตามกฎดังกล่าวข้างต้น
ตัวอย่าง:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
ตัวอย่างโดยละเอียดเพื่อให้ชัดเจนว่าอัลกอริทึมทำงานอย่างไร:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
วิธีการของคุณไม่จำเป็นต้องใช้อัลกอริทึมจากด้านบนตราบใดที่วิธีการแก้ปัญหาของคุณและอัลกอริทึมคืนค่าเอาต์พุตเดียวกันสำหรับอินพุตที่อนุญาตทั้งหมด นี่คือความท้าทายรหัส - กอล์ฟ
ขอบคุณ@Linusสำหรับความคิดเห็น sandbox ที่เป็นประโยชน์!