ปัญหา
สมมติว่าคุณมีสแต็ค N ชื่อ S 1ถึง S Nโดยที่ S k (k = 1 ถึง N) แต่ละอันมี N สำเนาของหมายเลข k
ตัวอย่างเช่นเมื่อ N = 3 กองที่มีลักษณะเช่นนี้:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
ที่นี่มีการจัดทำดัชนี 3 กองเป็น 1, 2 และ 3 และแต่ละอันมี N อินสแตนซ์ของดัชนีของตนเอง
เป้าหมายคือการจัดเรียงสแต็คใหม่ให้แต่ละกลุ่มมีหมายเลข 1 ถึง N ตามลำดับจากบนลงล่าง
เช่นสำหรับ N = 3 เป้าหมายคือจัดเรียงสแต็คใหม่เป็น:
1 1 1
2 2 2
3 3 3
=======
1 2 3
การกระทำที่เดียวที่คุณสามารถดำเนินการกับสแต็คจะสละตัวเลขด้านบนจากหนึ่งในกอง (popping) แล้วทันทีที่วางไว้ที่ด้านบนของสแต็คที่แตกต่างกัน (การผลักดัน) ภายใต้ข้อกำหนดเหล่านี้:
จำนวนสามารถถูกส่งไปยังสแต็กได้ถ้ามันน้อยกว่าหรือเท่ากับจำนวนสูงสุดของสแต็กนั้น
เช่น
1
สามารถผลักลงบนสแต็กด้วย a1
,2
หรือ3
ที่ด้านบน แต่2
สามารถผลักลงบนสแต็กที่มี2
หรือ3
(หรือสูงกว่า) ที่ด้านบนเท่านั้นสิ่งนี้มีเอฟเฟกต์ที่สแต็คเพิ่มขึ้นเป็นจำเจเสมอจากบนลงล่าง
สแต็กที่ไม่มีข้อยกเว้นใด ๆ อาจถูกดึงออกมาและถ้าเป็นไปได้ว่ากระสุนที่ผ่านมานั้นเป็นที่พอใจ
สามารถกดหมายเลขใดก็ได้ลงในสแต็กเปล่า
กองซ้อนไม่มีขีดจำกัดความสูงสูงสุด
สแต็คไม่สามารถสร้างหรือทำลายได้มี N ตัวเสมอ
ความท้าทายนี้เกี่ยวกับการตัดสินใจเลือกว่าจะเกิดอะไรขึ้นและผลักดันเพื่อให้การแลกเปลี่ยนสแต็คเสร็จสมบูรณ์ไม่จำเป็นว่าจะต้องเคลื่อนไหวน้อยที่สุด
(การฝึกฝนไพ่สำรับเป็นวิธีที่ดีในการทำความเข้าใจกับปัญหา)
ท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มบวก N ซึ่งรับประกันว่าเท่ากับ 3 หรือสูงกว่า พิมพ์หรือส่งคืนสตริงที่แสดงถึงการกระทำแบบป๊อปพุชทั้งหมดที่จำเป็นในการจัดเรียงสแต็คจากสถานะเริ่มต้น:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
=============
1 2 3 4 5
(N = 5 กรณี)
ไปยังสถานะสุดท้าย:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
=============
1 2 3 4 5
ทุกบรรทัดในผลลัพธ์ของคุณต้องมีตัวเลขสองตัวคั่นด้วยช่องว่าง หมายเลขแรกคือดัชนีของสแต็กที่จะปรากฏขึ้นและหมายเลขที่สองคือดัชนีของสแต็กที่จะพุช การดำเนินการของทุกบรรทัดตามลำดับควรจัดเรียงสแต็คอย่างถูกต้องโดยไม่ทำลายกฎใด ๆ
ตัวอย่างเช่นนี่คือผลลัพธ์ที่ใช้ได้สำหรับกรณี N = 3:
1 2 [move the top number on stack 1 to the top of stack 2]
1 2 [repeat]
1 2 [repeat]
3 1 [move the top number on stack 3 to the top of stack 1]
2 3 [etc.]
2 3
2 3
2 1
2 1
2 1
3 1
3 1
3 1
3 2
1 2
1 2
1 2
1 3
2 3
2 3
2 3
1 2
3 2
3 1
หมายเหตุ
ผลลัพธ์ของคุณไม่จำเป็นต้องดีที่สุดแก้ไขให้ถูกต้องเท่านั้น เช่นคุณไม่จำเป็นต้องลดจำนวนการปรากฏและการย่อให้เล็กสุด
- ดังนั้นจะไม่เป็นไรถ้าพูดว่ามีการเคลื่อนไหวบางอย่างซ้ำ ๆ และกลับด้านทันที
- การแทงและผลักไปที่กองซ้อนเดียวกันในการเคลื่อนที่ครั้งเดียว
2 2
ก็ทำได้เช่นกัน (แม้ว่าจะไม่มีจุดหมายแน่นอน)
ผลลัพธ์ของคุณจะต้องกำหนดและ จำกัด
โปรดจำไว้ว่าสแต็คมีการจัดทำดัชนีแบบ 1 ไม่อนุญาตการสร้างดัชนีแบบ 0
แน่นอนว่ามากกว่า 9 ควรทำงานเช่นเดียวกับหลักเดียว N
หากต้องการคุณสามารถใช้อักขระ ASCIIสองตัวที่แตกต่างกันและไม่ใช่ตัวเลขที่พิมพ์ได้แทนช่องว่างและบรรทัดใหม่ ขึ้นบรรทัดใหม่ (หรือการขึ้นบรรทัดใหม่แทน) ในผลลัพธ์นั้นใช้ได้
เกณฑ์การให้คะแนน
รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นคำตอบที่โหวตให้สูงกว่า
คะแนนบราวนี่บราวนี่ถ้าคุณสามารถแสดงอัลกอริทึมของคุณได้ดีที่สุด
-._(._.)_.-
N=3
เหมาะสมที่สุดหรือไม่