คำหลักที่สื่อความหมาย (สำหรับการค้นหา): สร้างสอง Matrices Equivalent, Overlap, Array, Find
ท้าทาย
ซานต้ามีประวัติของเอลฟ์ที่ขโมยของขวัญจากห้องนิรภัยของเขาในอดีตดังนั้นในปีนี้เขาได้ออกแบบกุญแจที่ยากต่อการถอดรหัส น่าเสียดายที่เขาสูญเสียชุดค่าผสมและเขาไม่สามารถหาวิธีเปิดได้! โชคดีที่เขาจ้างคุณให้เขียนโปรแกรมเพื่อค้นหาชุดค่าผสม ไม่จำเป็นต้องสั้นที่สุด แต่เขาต้องการค้นหาให้เร็วที่สุด!
เขามีตารางงานที่เข้มงวดมากและเขาไม่สามารถรอได้นานมาก คะแนนของคุณจะเป็นจำนวนรันไทม์ทั้งหมดของโปรแกรมของคุณคูณด้วยจำนวนขั้นตอนที่โปรแกรมของคุณแสดงผลสำหรับอินพุตการให้คะแนน คะแนนต่ำสุดชนะ
ข้อมูลจำเพาะ
ล็อคเป็นเมทริกซ์จตุรัส 1s และ 0s มันถูกตั้งค่าเป็นการจัดเรียงแบบสุ่มของ 1s และ 0s และต้องถูกตั้งค่าเป็นรหัสที่ระบุ โชคดีที่ซานต้าจดจำรหัสที่ต้องการได้
มีไม่กี่ขั้นตอนที่เขาสามารถทำได้ แต่ละขั้นตอนสามารถดำเนินการกับเมทริกซ์ย่อยที่ต่อเนื่องกัน (นั่นคือคุณต้องเลือกเมทริกซ์ย่อยที่ล้อมรอบทั้งหมดด้วยมุมบนซ้ายและขวาล่าง) (อาจเป็นเมทริกซ์ย่อยที่ไม่ใช่สแควร์):
- หมุนไปทางขวา 90 องศา *
- หมุนซ้าย 90 องศา *
- หมุน 180 องศา
- วนรอบ
n
องค์ประกอบแต่ละแถวทางซ้ายหรือขวา (แรป) - วน
m
องค์ประกอบแต่ละคอลัมน์ขึ้นหรือลง (wraps) - พลิกแนวนอน
- พลิกในแนวตั้ง
- พลิกบนเส้นทแยงมุมหลัก *
- พลิกบนหลักต่อต้านเส้นทแยงมุม *
* เฉพาะในกรณีที่เมทริกซ์ย่อยเป็นจตุรัส
แน่นอนว่าเขาสามารถทำตามขั้นตอนเหล่านี้กับเมทริกซ์ทั้งหมดได้ เนื่องจาก 1s และ 0s สามารถสลับบนเมทริกซ์ได้เท่านั้น แต่ค่าของจตุรัสไม่สามารถเปลี่ยนแปลงได้โดยตรงจำนวน 1s และ 0s จึงเหมือนกันสำหรับการกำหนดค่าเริ่มต้นและสิ้นสุด
ข้อกำหนดการจัดรูปแบบ + กฎ
คุณจะได้รับอินพุตเป็นเมทริกซ์สี่เหลี่ยมสองตัว (ตำแหน่งเริ่มต้นและตำแหน่งสิ้นสุด) ในรูปแบบที่เหมาะสมที่คุณต้องการ เอาต์พุตควรเป็นลำดับของขั้นตอนเหล่านี้ในรูปแบบที่อ่านได้ เนื่องจากนี่ไม่ใช่โค้ดกอล์ฟโปรดทำให้เป็นรูปแบบที่ตรวจสอบได้ง่าย แต่นั่นไม่ใช่ข้อกำหนดที่เข้มงวด คุณสามารถเลือกใช้ความยาวด้านข้างของเมทริกซ์ในอินพุตถ้าคุณต้องการ
โปรแกรมของคุณจะถูกเรียกใช้บนคอมพิวเตอร์ของฉัน (Linux Mint รายละเอียดรุ่นที่แน่นอนสามารถขอได้หากใครสนใจ: P) และฉันจะใช้เวลาตามจำนวนเวลาระหว่างเวลาที่ฉันกด "Enter" บนบรรทัดคำสั่งและเมื่อ ออกจากคำสั่ง
กรณีทดสอบ
1 0 0 1 0 0 0 0
0 1 1 0 -> 0 0 0 0
0 1 1 0 -> 1 1 1 1
1 0 0 1 1 1 1 1
- รับเมทริกซ์ทั้งหมด วนรอบแต่ละคอลัมน์ขึ้น 1
- ใช้คอลัมน์กลางสองคอลัมน์เป็นตารางย่อย วนรอบแต่ละคอลัมน์ลง 2
1 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 -> 0 1 1 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
- รับเมทริกซ์ทั้งหมด วนรอบแต่ละคอลัมน์ลง 1
- ใช้คอลัมน์กลาง วนมันลง 2
- ใช้ 2 แถวบนสุด พลิกมันในแนวตั้ง
- รับองค์ประกอบ 2 แถวที่อยู่ขวาสุดของแถวบน สลับพวกเขา (หมุนขวา / ซ้าย 1 พลิกในแนวนอน)
- ใช้องค์ประกอบซ้ายสุดของแถวบนสุด 2 รายการ สลับพวกเขา
อาจมีวิธีที่มีประสิทธิภาพมากกว่า แต่ก็ไม่สำคัญ อย่าลังเลที่จะชี้ให้พวกเขาเห็นในความคิดเห็นหากคุณพบ :)
การตัดสินคดีทดสอบ
กรณีทดสอบนี้จะใช้เพื่อตัดสินการส่งของคุณ หากฉันเชื่อว่าคำตอบมีความเชี่ยวชาญในกรณีทดสอบมากเกินไปฉันมีสิทธิ์ที่จะเลือกอินพุตแบบสุ่มและตอบกลับคำตอบทั้งหมดด้วยเคสใหม่ กรณีทดสอบสามารถพบได้ที่นี่ที่ด้านบนเป็นจุดเริ่มต้นและด้านล่างคือการกำหนดค่าที่ต้องการ
ถ้าผมเชื่อว่าคำตอบมีความเชี่ยวชาญมากเกินไป MD5 3c1007ebd4ea7f0a2a1f0254af204eed
กรณีทดสอบต่อไปคือ (นี่เขียนไว้ที่นี่ตอนนี้เพื่อปลดปล่อยตัวเองจากการถูกกล่าวหาว่าโกง: P)
ช่องโหว่มาตรฐานใช้ จะไม่ยอมรับคำตอบ การเข้ารหัสที่มีความสุข!
หมายเหตุ: ผมดึงแรงบันดาลใจสำหรับชุดความท้าทายนี้จากการจุติของรหัส ฉันไม่มีส่วนเกี่ยวข้องกับเว็บไซต์นี้
คุณสามารถดูรายการของความท้าทายทั้งหมดในซีรีส์โดยดูที่ส่วน 'เชื่อมโยง' ของความท้าทายแรกที่นี่
0
และ 641
และมี256 choose 64 ≈ 1.9 × 10⁶¹
เมทริกซ์ที่เข้าถึงได้ทั้งหมด (ซึ่งเปรียบได้กับ Megaminx และมีขนาดใหญ่กว่า Rubik's Revenge แม้ว่าจะน้อยกว่าลูกบาศก์ของศาสตราจารย์)