หมุนทุกแถวและคอลัมน์ในเมทริกซ์


15

ความท้าทาย

รับn x nเมทริกซ์ของจำนวนเต็มด้วยn >= 2

1 2
3 4

และรายการจำนวนเต็มที่มี2nองค์ประกอบทุกประการ

[1,2, -3, -1]

เอาท์พุทเมทริกซ์หมุน เมทริกซ์นี้ถูกสร้างขึ้นด้วยวิธีต่อไปนี้:

  • ใช้จำนวนเต็มแรกในรายการและหมุนแถวแรกไปทางขวาด้วยค่านี้
  • ใช้จำนวนเต็มถัดไปและหมุนคอลัมน์แรกลงตามค่านี้
  • ใช้จำนวนเต็มถัดไปและหมุนแถวที่สองไปทางขวาด้วยค่านี้ ฯลฯ จนกระทั่งคุณหมุนทุกแถวและคอลัมน์ของเมทริกซ์หนึ่งครั้ง

รายการสามารถมีจำนวนเต็มลบซึ่งหมายความว่าคุณเลื่อนแถว / คอลัมน์ซ้าย / ขึ้นแทนที่จะขวา / ลง หากจำนวนเต็มเป็นศูนย์อย่าหมุนแถว / คอลัมน์

ตัวอย่างการใช้อินพุตด้านบน

รายการองค์ประกอบคำอธิบายเมทริกซ์
-------------------------------------------------- ----------
1 2 1 หมุนแถวที่ 1 ทางขวา 1
                   3 4

2 2 1 หมุนคอลัมน์ที่ 1 ลง 2
                   3 4

-3 2 1 หมุนแถวที่ 2 จากซ้าย 3
                   4 3

-1 2 3 หมุนคอลัมน์ที่ 2 ขึ้น 1
                   4 1

กฎระเบียบ

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

กรณีทดสอบ

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

[[1,2], [3,4]], [1,2, -3, -1] -> [[2,3], [4,1]]
[[1,2], [3,4]], [1,1,1,1] -> [[3,2], [4,1]]
[[1,2], [3,4]], [0,0,0,0] -> [[1,2], [3,4]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [1, -2,0, -1,3,4] -> [[7, 5,0], [- 3, -8,2], [- 4,1,6]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [3,12, -3,0, -6, -3] -> [[1 , 2, -3], [- 4,5,6], [7 -8,0]]

Happy Coding!


mapcar น่าจะช่วย…
msh210

คำตอบ:


6

CJam, 13 ไบต์

{{a.m>1m<z}/}

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

เรียกใช้กรณีทดสอบทั้งหมด

แนวคิดเดียวกันจำนวนไบต์เดียวกันการใช้งานที่แตกต่างกัน:

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

คำอธิบาย

โดยหลักการแล้วเราต้องการปฏิบัติต่อคำสั่งต่าง ๆ ในรายการเหมือนกันและใช้เพื่อหมุนแถวแรกของเมทริกซ์ สิ่งนี้สามารถทำได้ค่อนข้างง่ายโดยการแปลงเมทริกซ์หลังจากการเรียนการสอนแต่ละครั้งเล็กน้อยและทำให้แน่ใจว่าการแปลงพิเศษเหล่านั้นยกเลิกในที่สุด ดังนั้นหลังจากประมวลผลคำสั่งแต่ละครั้งเราจะหมุนทุกแถวหนึ่งขึ้นไป (เช่นคำสั่งถัดไปในมิติเดียวกันจะประมวลผลแถวถัดไป) แล้วแปลงเมทริกซ์เพื่อที่เราจะประมวลผลคอลัมน์ถัดไป การแปลงเพิ่มเติมเหล่านี้เป็นมุมฉากกับคำแนะนำในรายการและมีช่วงเวลาที่แน่นอน2nเพียงแค่สิ่งที่เราต้องการ

สำหรับรหัส:

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/

4

APL (Dyalog Extended) , 17 15 14 13 ไบต์

-3 bytes โดยAdám

(⍉1⊖⌽`@1⍢⌽)/⌽

ลองออนไลน์!

รับอินพุตเป็นรายการโดยที่องค์ประกอบแรกคือเมทริกซ์และองค์ประกอบที่เหลือคือจำนวนการหมุน ถ้า⌽หมุนไปทางขวาแทนที่จะซ้ายนี่จะชนะ CJam

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.

{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)แต่คุณสามารถอธิบายให้ฉันทำไม@1จะไม่ทำงานแทน@(⍳1)หรือ@(,1)? นอกจากนี้ OP อาจอนุญาตให้คุณป้อนข้อมูลย้อนกลับได้
Adám

ดังนั้นปรากฎว่า dfns atซึ่งอยู่ด้านหลังส่วนขยาย@ไม่ใช่ส่วนขยายที่เข้ากันได้ อย่างไรก็ตามคุณสามารถใช้พื้นเมือง@ด้วยซึ่งจะช่วยประหยัดไบต์มากกว่า`@1 @1 1
อดัม

การหมุนทำงานแตกต่างกันใน apl vs J หรือไม่? ฉันพยายามที่จะแปลสิ่งนี้เป็น J และพบว่ามันละเอียดมากขึ้น ...
Jonah

2

Python 2, 96 ไบต์

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

การทดสอบ

fส่งคืนรายการ tuples แต่ละบรรทัดในส่วนของฟังก์ชั่นนั้นมีการย่อหน้าด้วย 1 แท็บ


จะไม่return zip(*m)ช่วยให้คุณ 5 ไบต์ตรงไปตรงมา?
Denker

@DenkerAffe: คุณแนะนำให้แทนที่m=zip(*m);return mด้วยreturn zip(*m)ใช่หรือไม่ ฉันทำไม่ได้เพราะm=zip(*m)เป็นส่วนหนึ่งของforลูป
vaultah

ใช่ว่าเป็นของฉัน ไม่เห็นว่ามันอยู่ในลูปของฉันไม่ดี
Denker

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