แรงบันดาลใจจากคำถามนี้
อีกวิธีในการคลายภาพ 2D ลงในสาย 1D คือใช้Hilbert Curve
โค้งนี้มีหลายรุ่นขึ้นอยู่กับจำนวนการวนซ้ำที่ใช้ในขณะคำนวณ ด้านล่างติดตามตัวอย่างของ Hilbert Curves จากลำดับแรกถึงลำดับที่ห้า
วิธีการคำนวณเส้นโค้งนี้มีดังต่อไปนี้ อันดับแรกเรากำหนดคำสั่งแรกของ Hilbert Curve ตามที่แสดงในรูป (อันสำหรับ n = 1) เพื่อให้มันพอดีกับสี่เหลี่ยม 1x1 เรากว่าทำโค้งสี่ชุดนี้ให้เว้นระยะห่างในจตุรัส 4x4 เพื่อให้พวกเขาทั้งหมดนำเสนอ "เว้า" ทางด้านซ้าย จากนั้นเราพลิกทั้งสองซ้ายสุดเพื่อ 1 โค้งเพื่อให้หนึ่งเว้าด้านบนหันไปทางด้านบนในขณะที่ด้านล่างหันด้านล่าง ในที่สุดเราก็เชื่อมมุมของ Hilbert Curves ที่อยู่ติดกัน หากต้องการรับเส้นโค้ง (n + 1) เพื่อเราจะต้องทำซ้ำขั้นตอนด้วยเส้นโค้ง n-order สี่เส้น เราสามารถเห็นการสร้างภาพของกระบวนการที่นี่ (ฉันจะเพิ่มภาพรายละเอียดกระบวนการในไม่ช้า)
งานของคุณในการท้าทายนี้คือการคลี่เมทริกซ์ของจำนวนเต็มตามลำดับต่ำสุดของ Hilbert Curveสำหรับเมทริกซ์นั้น
เพื่อความง่ายเราจะมีเส้นโค้งที่เริ่มต้นจากมุมซ้ายบนของเมทริกซ์
คุณสามารถรับอินพุตเป็นรายการของจำนวนเต็มโดยที่แต่ละรายการย่อยจะแสดงแถวของเมทริกซ์
คุณสามารถสันนิษฐานได้ว่าอินพุตจะเป็นเมทริกซ์จตุรัส (n * n)
ตัวอย่างเช่น:
การป้อนข้อมูล:
[[ 1, 2,]
[ 3, 4 ]]
เอาท์พุท:
[ 1, 2, 4, 3 ]
เนื่องจากเราใช้คำสั่งแรกของ Hilbert Curve ดังแสดงในรูป
การป้อนข้อมูล:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
เอาท์พุท:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
ใช้ลำดับที่สองของ Hilbert Curve
ตามปกติจะไม่อนุญาตให้มีช่องโหว่มาตรฐาน
นี่คือโค้ดกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ