หากคุณไม่ทราบว่าหอคอยแห่งฮานอยคืออะไรฉันจะอธิบายสั้น ๆ : มีแท่งสามแท่งและแผ่นบางส่วนที่มีขนาดแตกต่างกัน ในการเริ่มต้นแผ่นทั้งหมดอยู่ในหอคอยแรกตามลำดับ: ที่ใหญ่ที่สุดอยู่ที่ด้านล่างที่เล็กที่สุดที่ด้านบน เป้าหมายคือนำแผ่นดิสก์ทั้งหมดไปยังแกนที่สาม ฟังดูง่ายไหม นี่คือการจับ: คุณไม่สามารถวางแผ่นดิสก์ที่ด้านบนของแผ่นดิสก์ที่มีขนาดเล็กกว่าแผ่นดิสก์อื่น คุณสามารถถือแผ่นดิสก์ไว้ในมือของคุณในเวลาเดียวที่จะย้ายพวกเขาไปยังคันอื่นและคุณสามารถวางแผ่นดิสก์บนแท่งเท่านั้นไม่ได้อยู่บนโต๊ะคุณไอ้ขี้ขลาด
โซลูชัน ascii ตัวอย่าง:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
ท้าทาย
มีแท่งสามอันเรียกว่า A, B และ C (คุณสามารถเรียกพวกเขา 1,2 และ 3 ได้อย่างเคารพถ้าช่วยได้) ในตอนแรกแผ่น n ทั้งหมดอยู่บนแท่ง A (1)
ความท้าทายของคุณคือการตรวจสอบทางออกสำหรับหอคอยฮานอย คุณจะต้องตรวจสอบให้แน่ใจว่า:
- ในตอนท้ายแผ่นดิสก์ทั้งหมดอยู่บนแท่ง C (3)
- สำหรับแผ่นดิสก์ใด ๆ ในสถานะที่กำหนดไม่มีดิสก์ขนาดเล็กกว่าด้านล่าง
- ไม่มีข้อผิดพลาดที่เห็นได้ชัดเช่นพยายามนำแผ่นดิสก์จากแท่งที่ว่างเปล่าหรือแผ่นดิสก์ที่กำลังเคลื่อนที่ไปยังแท่งที่ไม่มีความยาว
(การแก้ปัญหาไม่จำเป็นต้องดีที่สุด)
อินพุต
โปรแกรมของคุณจะได้รับสองอินพุต:
- จำนวนแผ่น n (จำนวนเต็ม)
การเคลื่อนไหวที่ถูกนำมาซึ่งจะประกอบด้วยชุดของ tuples ของ: (หอคอยที่จะนำดิสก์บนสุดในปัจจุบันจาก), (หอคอยที่จะนำดิสก์นี้ไป) ที่แต่ละ tuple หมายถึงการย้าย คุณสามารถเลือกวิธีการแสดง ตัวอย่างเช่นวิธีต่อไปนี้ในการแสดงวิธีแก้ปัญหาสำหรับ n = 2 ที่ฉันวาดใน ascii ด้านบน (ฉันจะใช้ตัวแรกในกรณีทดสอบเพราะมันง่ายต่อการมองเห็น):
"A-> B; A-> C; B-> C"
[( "A", "B") ( "A", "C") ( "B", "C")]
[(1,2), (1,3), (2,3)]
"ABACBC"
[1,2,1,3,2,3]
เอาท์พุต
ความจริงหากเงื่อนไขที่สามารถพบได้ภายใต้ "ท้าทาย" ถือ
เป็นเท็จถ้าไม่
กรณีทดสอบ:
จริง:
n=1, "A->C"
n=1, "A->B ; B->C"
n=2, "A->B ; A->C ; B->C"
n=2, "A->C ; C->B ; A->C ; B->C"
n=2, "A->C ; A->B ; C->B ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C ; B->C"
เท็จ:
รายการที่ 3 แนะนำโดย @MartinEnder, อันดับที่ 7 โดย @Joffan
n=1, "A->B"
n=1, "C->A"
n=2, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=2, "A->B ; A->C ; C->B"
n=2, "A->C ; A->B ; C->B ; B->A"
n=2, "A->C ; A->C"
n=3, "A->B ; A->D; A->C ; D->C ; A->C"
n=3, "A->C ; A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->B ; B->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; C->B"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C"
n=4, "A->B ; A->B ; A->B ; A->C ; B->C ; B->C ; B->C"
นี่คือcode-golfทางออกที่สั้นที่สุดชนะ ใช้กฎมาตรฐานและช่องโหว่ ไม่รวมแบตเตอรี่
A->A
ไหมว่าจะไม่มีการเคลื่อนไหวที่ไม่เป็นเช่นนั้น?
moving discs to nonexistant rods.
ให้แน่ใจใช่มันเป็นD
A=1
,B=2
,C=3
ฯลฯ )?