หรือเลื่อนคอลัมน์และแถวของอาร์เรย์ 2 มิติ


15

วัตถุประสงค์

กำหนดขนาดอาร์เรย์ 2 มิติให้เขียนโปรแกรมหรือฟังก์ชั่นเพื่อเลื่อนคอลัมน์หรือแถวอื่น

ตัวอย่าง

a b c d e
f g h i j
k l m n o

องค์ประกอบทั้งหมดในคอลัมน์แรกเลื่อนลงหนึ่งแถวคอลัมน์ที่สองเลื่อนขึ้นหนึ่งแถวส่วนที่สามเลื่อนลงหนึ่งแถวและอื่น ๆ โดยพันเมื่อถึงขอบ

k g m i o
a l c n e
f b h d j  

องค์ประกอบทั้งหมดในครั้งแรกกะแถวไปทางขวาที่สองจะไปซ้ายที่สามไปทางขวาฯลฯ ห่อเมื่อพวกเขามาถึงขอบ

o k g m i
l c n e a
j f b h d

ฉันจะทำตามประเพณีการเลือกรหัสการทำงานสั้นที่สุดเป็นคำตอบที่ดีที่สุด


อาร์เรย์สามารถมีขนาดใดก็ได้หรือ 3x5 เฉพาะหรือไม่
Jo King

ฉันกำลังมองหาอาร์เรย์ 2 มิติที่เต็มไปด้วย ขอโทษที่ไม่ได้พูดถึงมัน ป่วยเพิ่มการแก้ไข
Karan Shishoo

การจัดรูปแบบที่ไม่เหมาะสมทำให้คำถามดูเหมือนว่าเป็นคำถามนอกหัวข้อจากผู้ใช้ SO ที่ขี้เกียจ
user202729

(BTW ไม่ยอมรับคำตอบเร็วเกินไป)
user202729

5
@kshishoo สำหรับความท้าทายในอนาคตคุณสามารถใช้Sandbox เพื่อตรวจสอบรายการที่ซ้ำกันและ / หรือรวบรวมข้อเสนอแนะก่อนโพสต์บนไซต์หลัก
Rod

คำตอบ:



7

MATL , 13 ไบต์

,!tZy:oEq2&YS

ลองออนไลน์!

คำอธิบาย

,        % Do twice
  !      %   Transpose. Takes input implicitly the first time
  t      %   Duplicate
  Zy     %   Size. Gives a vector with numbers of rows and of columns
  :      %   Range from 1 to the first entry of the vector (number of rows)
  o      %   Parity: gives 0 or 1 for eacn entry
  Eq     %   Times 2, minus 1: transforms 0 into -1
  2      %   Push 2
  &YS    %   Circularly shift along the second dimension. This shifts the
         %   first row by 1 (that is, to the right), the second by -1 (to
         %   the left), etc.
         % End (implicit). Display (implicit)

6

J , 26, 21 19 ไบต์

-5 ไบต์ขอบคุณไมล์

(|."_1~_1^#\)@|:^:2

คำอธิบาย:

^:2 - ยกเลิกสองต่อไปนี้:

@|: - ขนย้ายและ

#\ - ค้นหาความยาวของส่วนนำหน้า (1, 2, 3 ... แถว)

_1^ - เพิ่ม -1 เป็นพลังเหนือสร้างรายการสลับ -1 1 -1 1 ...

|."_1~ - หมุนแต่ละแถวของอาร์เรย์อินพุตด้วย offset จากรายการด้านบน

ลองออนไลน์!

รุ่นเดิม:

(($_1 1"0)@#|."0 1])@|:^:2

มันทำงานอย่างไร

^:2 - ยกเลิกสองต่อไปนี้:

|: - ขนย้ายและ

|."0 1] - หมุนแต่ละแถวของอาร์เรย์ที่ป้อนเข้า, ออฟเซ็ตในรายการ:

@# - จำนวนแถวในอาร์เรย์

($_1 1"0) - ทางเลือก _1 1 (3 -> _1 1 _1)

ลองออนไลน์!


1
คุณสามารถสร้าง_1 1..ใช้(|."_1~_1^2|#\)@|:^:2ยัง
ไมล์

@miles ขอบคุณนั่นเป็นรหัสที่ยอดเยี่ยม!
Galen Ivanov

@miles ในความเป็นจริงฉันไม่ต้องการ2|ส่วน
Galen Ivanov

1
ใช่คุณทำไม่ได้นั่นคืออีก 2 ไบต์ที่บันทึกไว้
ไมล์




2

APL (Dyalog Unicode)ขนาด 26 ไบต์

{(¯1 1⍴⍨≢⍵)⌽(¯1 1⍴⍨≢⍉⍵)⊖⍵}

ลองออนไลน์!

คำนำหน้า Dfn

อย่างไร?

{(¯1 1⍴⍨≢⍵)⌽(¯1 1⍴⍨≢⍉⍵)⊖⍵}⍝ Main function, prefix. Input matrix is ⍵.
                        ⊖⍵}⍝ Rotate the columns of  according to the left arg:
            (       ⍉⍵)     Transpose  (makes a 3x5 matrix become 5x3)
                           Tally (yields the number of rows of the matrix)
                           Swap arguments of the following fn/op
                           Shape
             ¯1 1           This vector. This yields a vector of ¯1 1 with size = number of columns of ⍵.
                           Rotate the rows of  according to the left arg:
{(¯1 1⍴⍨≢⍵)                 Does the same as the preceding expression, without transposing ⍵.


2

JavaScript (ES6), 94 91 ไบต์

a=>(g=a=>a[0].map((_,i)=>(b=a.map(a=>a[i]),i%2?[...b.slice(1),b[0]]:[b.pop(),...b])))(g(a))

อาจเป็นวิธีที่นักกอล์ฟจะทำการหมุน ...


2

Pyth, 15 ไบต์

L.e.>b^_1k.Tbyy

ลองออนไลน์

คำอธิบาย

L.e.>b^_1k.Tbyy
L           b      Define a function on a list...
          .T       ... which transposes it...
 .e.>b^_1k         ... and rotates each row alternating left and right.
             yyQ   Apply twice to the (implicit) input array.

2

q / kdb + , 32 ไบต์

วิธีการแก้:

{rotate'[#:[x+:]#-1 1](+)x}/[2;]

ตัวอย่าง:

q)3 5#.Q.a / reshape "a..o" into 3 row, 5 column grid
"abcde"
"fghij"
"klmno"
q){rotate'[#:[(+)x]#-1 1](+)x}/[2;]3 5#.Q.a
"okgmi"
"lcnea"
"jfbhd"

คำอธิบาย:

พลิกตารางเพื่อใช้การหมุนกับคอลัมน์การวนซ้ำครั้งที่สองจะพลิกอีกครั้งดังนั้นการหมุนจะถูกนำไปใช้กับแถวในรอบที่สอง

การหมุนจะขึ้นอยู่กับรายการ-1 1 -1 1..ความยาวของแถว / คอลัมน์ที่ถูกหมุน

ขนาด9 ไบต์ที่สมบูรณ์แข็งแรงถูกนำออกมาจากเวอร์ชั่นที่อ่านง่าย

{rotate'[count[flip x]#-1 1;flip x]}/[2;] / ungolfed solution
{                                  }/[2;] / perform lambda 2 times
 rotate'[                  ;      ]       / perform rotate on each-both
                            flip x        / flip x<->y of grid
                      #-1 1               / take from list -1 1
         count[flip x]                    / the length of the flipped grid

2

JavaScript (ES6),  116  76 ไบต์

m=>(g=m=>m[0].map((_,x)=>m.map(_=>m[y++%h][x],h=m.length,y=x&1||h-1)))(g(m))

ลองออนไลน์!

แสดงความคิดเห็น

m => (                 // m[] = input matrix
  g = m =>             // g is the main helper function taking a matrix m[]
    m[0].map((_, x) => // for each column at position x in m[]:
      m.map(_ =>       //   for each row of m[]:
        m[y++ % h][x], //     yield the x-th value of the row (y mod h) and increment y
        h = m.length,  //     h = number of rows
        y = x & 1      //     start with y = 1 if x is odd,
            || h - 1   //     or h - 1 if x is even
      )                //   end of inner map()
  )                    // end of outer map()
)(g(m))                // invoke g twice on the input matrix




0

APL NARS, 36 ไบต์, 18 ตัวอักษร

c←b∘b←{⍵⌽⍨-×-\⍳≢⍵}∘⍉

{⍵⌽⍨-× - \ ⍳≢⍵} นี้จะหมุนแต่ละแถวของอาร์กิวเมนต์เมทริกซ์ไปตามเวกเตอร์ -1 1 -1 1 1 ฯลฯ (ที่มีความยาวเวกเตอร์เท่ากับความยาวของแถวเมทริกซ์อาร์กิวเมนต์) ทดสอบ:

  ⎕←a←3 5⍴⎕A
ABCDE
FGHIJ
KLMNO
  ⎕←c a
OKGMI
LCNEA
JFBHD

ขอให้เรายังคงอภิปรายนี้ในการแชท
Erik the Outgolfer

0

bash et al, 84

วิธีแก้ปัญหาเชลล์ที่ไม่ใช่คู่แข่ง

นี่คือพื้นฐานของฟังก์ชันที่สลับทิศทางของการหมุนของแถว ขั้นตอนเดียวกับที่ทำในอาร์เรย์ที่ถูกเปลี่ยนจะหมุนคอลัมน์ ตัวอย่างเช่นtranspose | rotate | transpose | rotateเช่น

การหมุนสลับสามารถทำได้ในอาร์เรย์อักขระเดียวด้วยsedเช่นนี้

sed -E 's/(.*) (.)$/\2 \1/; n; s/^(.) (.*)/\2 \1/'

การขนย้ายสามารถทำได้ด้วยrsหรือdatamash:

rs -g1 -T
datamash -t' ' transpose

ถ่ายด้วยกัน:

r() { sed -E 's/(.*) (.)$/\2 \1/; n; s/^(.) (.*)/\2 \1/'; }
t() { rs -g1 -T; }
<f t | r | t | r

เอาท์พุท:

o k g m i
l c n e a
j f b h d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.