หมุนทุก 2x2 บล็อกในเมทริกซ์


11

ความท้าทาย

รับn x mเมทริกซ์ด้วยn > 1และm > 1 เต็มไปด้วยจำนวนเต็ม

1 2 3
4 5 6

และรายการจำนวนเต็มที่มีค่ามากที่สุดเท่าที่2x2บล็อกในเมทริกซ์ ( (n-1)*(m-1)ถ้าคุณต้องการจำนวนที่แน่นอน)

[1, 2]

เอาท์พุทเมทริกซ์ที่มีทุก2x2บล็อกหมุนโดยค่าปัจจุบันในรายการตามลำดับที่กำหนด ตัวอย่างข้างต้นจะให้ผล

4 6 2
5 3 1

บล็อกแรกจะถูกหมุนหนึ่งครั้งไปทางขวาและบล็อกที่สองจะถูกหมุนสองครั้งไปทางขวา

หมายเหตุ

  • จำนวนเต็มบวกหมายความว่าคุณหมุนไปตามหลายขั้นตอน
  • จำนวนเต็มลบหมายความว่าคุณหมุนซ้ายไปหลายขั้นตอน
  • เลขศูนย์หมายความว่าคุณไม่หมุน
  • คุณหมุนบล็อกแถวที่ชาญฉลาด นั่นหมายความว่าคุณเริ่มต้นในแถวแรกและไปทางขวา เมื่อคุณหมุนทุกบล็อกในแถวนั้นคุณจะไปยังบล็อกถัดไป ในตอนท้ายทุกบล็อคจะถูกหมุนหนึ่งครั้ง
  • โปรดทราบว่าบล็อกซ้อนทับกัน เมทริกซ์แรกด้านบนมีบล็อก[[1,2],[4,5]]และ[[2,3],[5,6]]ตัวอย่าง
  • การหมุนของบล็อกแต่ละครั้งจะมีผลต่อการหมุนของบล็อกที่อยู่ติดกัน นี่คือเหตุผลที่คุณต้องหมุนในรูปแบบที่อธิบายไว้ข้างต้น

กฎระเบียบ

  • คุณอาจใช้อินพุตในรูปแบบที่สะดวกที่สุด โปรดระบุคำตอบที่คุณใช้ สิ่งนี้ไม่อนุญาตให้คุณอ่าน matrix-wise block
  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • กฎเริ่มต้นสำหรับอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ Tiebreaker เป็นการส่งก่อนหน้า

กรณีทดสอบ

รูปแบบการป้อนข้อมูลที่นี่คือรายการของรายการสำหรับเมทริกซ์และรายการปกติสำหรับค่า

[[1,2], [3,4]], [-3] -> [[4,1], [3,2]]
[[1,1,1], [1,1,1]], [-333, 666] -> [[1,1,1], [1,1,1]]
[[1,2,3], [4,5,6]], [1,2] -> [[4,6,2], [5,3,1]
[[1,2,3], [4,5,6], [7,8,9]], [4,0,12, -20] -> [[1,2,3], [4, 5,6], [7,8,9]]
[[1,2,3,4,5], [5,4,3,2,1], [1,2,3,4,5]], [2, -3,4,1,6, 24,21, -5] -> [[4,1,5,2,4], [2,1,3,5,5], [3,2,4,3,1]

Happy Coding!

คำตอบ:


4

CJam ( 42 40 ไบต์)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

การสาธิตออนไลน์

โดยทั่วไปจะใช้เทคนิคเดียวกันสองครั้งในการพับบล็อก

{4,={+2/zW%~}*}

ซึ่งทำงานกับเมทริกซ์ 2x2 และจำนวนครั้งในการหมุน

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

สามารถประมวลผลด้วย

.{block}

และมีผลกระทบของ

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

เพราะ.(เหมือน%ใน CJam) ไม่รวบรวมผลลัพธ์เป็นอาร์เรย์จนกว่าจะเสร็จ


คุณสามารถบันทึกไบต์โดยใช้4,=โมดูโลที่ถูกต้อง (ยกเว้นว่าบล็อกของคุณต้องรันอย่างน้อยหนึ่งครั้ง)
Martin Ender

นอกจากนี้ยังเกี่ยวกับzW%การหมุน?
Martin Ender

@ MartinBüttnerฉันคิดว่าการหมุนดูเหมือนนานเกินไป แต่ฉันจำไม่ได้ เคล็ดลับดีที่โมดูโล่
Peter Taylor

2

CJam, 65 63 60 55 ไบต์

มีต้องเป็นวิธีที่ดีกว่าที่จะทำเช่นนี้ ...

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

นี่คือฟังก์ชันที่ไม่ได้ตั้งชื่อซึ่งคาดว่าคำสั่งและเมทริกซ์ (ตามลำดับ) บนสแต็กและปล่อยเมทริกซ์ที่เกิดขึ้นให้เข้าที่

ทดสอบที่นี่

คำอธิบาย

ฉันไม่รู้สึกอยากเขียนรหัสแบบเต็มสำหรับรหัสตอนนี้ดังนั้นภาพรวมคร่าวๆ:

  • การจัดการอาเรย์ 2 มิติเป็นความเจ็บปวดใน CJam ดังนั้นฉันจึงแทนที่จะคลี่เมทริกซ์ออกมาคำนวณการหมุนแต่ละครั้งเป็นการเปลี่ยนตำแหน่งขององค์ประกอบที่ตำแหน่งเฉพาะแล้วแบ่งอาร์เรย์ออกเป็นแถวอีกครั้งในตอนท้าย Nความกว้างของเมทริกซ์ถูกเก็บไว้ใน
  • หมุนเวียนในตำแหน่งในอาร์เรย์คลี่เปลี่ยนแปลงสี่ดัชนี:k , , , สำหรับแต่ละดัชนีตามรายการคำสั่งฉันคำนวณการเปลี่ยนแปลงที่สอดคล้องกับสิ่งนี้และนำไปใช้กับอาร์เรย์อินพุตที่ไม่ได้ควบคุมk <- k+1k+1 <- k+1+Nk+N <- kk+1+N <- k+1k
  • สิ่งนี้ทำให้เกิดปัญหาซึ่งในอาร์เรย์เชิงเส้นการหมุนบางอย่างจะถูกจัดตำแหน่งด้วยมุมซ้ายบนในคอลัมน์สุดท้ายของอินพุต ในการข้ามสิ่งเหล่านี้ฉันได้ใส่ศูนย์ลงในรายการคำสั่งเช่นบล็อกย่อย 2x2 ที่ไม่ถูกต้องเหล่านี้ได้รับการประมวลผลทางเทคนิค แต่ไม่มีการใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.