Xuất ra đường xoắn ốc ngược chiều kim đồng hồ của một mảng 2D


15

Từ câu hỏi stackoverflow này

Cho một mảng 2D có kích thước M×N , xuất các giá trị theo chiều ngược chiều kim đồng hồ. Đầu ra phải bắt đầu từ bên ngoài vào bên trong và điểm ban đầu luôn luôn là (0,0) .

Ví dụ đưa ra:

[1234567số 8910111213141516]

Các giá trị cạnh theo chiều ngược chiều kim đồng hồ là 1,5,9,13,14,15,16,12,số 8,4,3,2 .

Bây giờ chúng tôi lặp lại quá trình cho các giá trị bên trong. Điều này sẽ kết thúc với một ma trận như sau

[671011]

Và các giá trị bên trong là 6,10,11,7

Kết quả cuối cùng sẽ là 1,5,9,13,14,15,16,12,số 8,4,3,2,6,10,11,7


Quy tắc

  • Giả sử đầu vào không trống
  • Giả sử giá trị ma trận là số nguyên dương
  • Phương pháp I / O tiêu chuẩn được áp dụng
  • Chuẩn quy tắc và tiêu chuẩn áp dụng chiến thắng

Một số trường hợp thử nghiệm

Input
[
  [1, 2, 3, 4, 5, 6, 7],
  [8, 9, 10,11,12,13,14],
  [15,16,17,18,19,20,21]
]
Output
1,8,15,16,17,18,19,20,21,14,7,6,5,4,3,2,9,10,11,12,13

--------------------------------------------------------

Input
[
    [1,2,3],
    [3,2,1],
    [4,5,6],
    [6,5,4],
    [7,8,9],
    [9,8,7]
]
Output
1,3,4,6,7,9,8,7,9,4,6,1,3,2,2,5,5,8

-----------------------------------------------------
Input
[
    [1]
]
Output
1
-----------------------------------
Input
[
    [1, 2],
    [2, 1]
]
Output
1,2,1,2
-----------------------------------------------------
Input
[
    [1,2,3,6,7],
    [2,4,3,2,1],
    [3,2,4,5,6],
    [6,5,6,5,4],
    [10,4,7,8,9],
    [12,4,9,8,7]
]
Output
1,2,3,6,10,12,4,9,8,7,9,4,6,1,7,6,3,2,4,2,5,4,7,8,5,5,2,3,4,6

Vậy chúng ta sẽ đi theo chiều kim đồng hồ hay ngược chiều kim đồng hồ?
LegionMammal978

@ LegionMammal978 ngược chiều kim đồng hồ (tôi mặc dù nó được gọi là ngược chiều kim đồng hồ)
Luis felipe De jesus Munoz

7
Cả hai chiều ngược và ngược chiều kim đồng hồ đều đúng, với mỗi loại phổ biến hơn trong BrEng và AmEng, tương ứng. Nếu bạn thực sự muốn nhầm lẫn, bạn cũng có thể sử dụng widderhins .
Chấn thương kỹ thuật số

Câu trả lời:


12

R , 54 byte

Một số byte được lưu bởi @Giuseppe và @ J.Doe.

f=function(m)if(ncol(m))c(m[,1],f(t(m[nrow(m):1,-1])))

Hãy thử trực tuyến!

Đệ quy loại bỏ cột đầu tiên và đảo ngược hàng / chuyển vị (làm cho hàng dưới cùng thành cột đầu tiên mới) phần còn lại của ma trận cho đến khi bạn kết thúc chỉ với một cột. Phiên bản "truyền thống" của Ungolfed:

f <- function(m) {
 if(ncol(m) == 1) {
    m
  } else {
    c(m[,1], f(t(m[nrow(m):1,-1])))
  }
}

Nó đã chỉ ra rằng ncol(m)có thể được đánh gôn để sum(m)lưu một byte khác bởi vì chúng tôi được phép giả sử các giá trị ma trận nguyên dương. Nhưng tôi sẽ để nó như thế này vì nó hoạt động cho tất cả các ma trận (thậm chí cả ma trận của chuỗi!)


ồ Tôi thích cách sử dụng t()ngăn chặn drop=TRUEmặc định để `[`làm hỏng ifđiều kiện!
Giuseppe

và tiết lộ đầy đủ, tôi đã có khoảng một giải pháp 200 byte thậm chí không hoạt động, vì vậy, rất tốt cho bạn! Có lẽ tôi sẽ nhận được xung quanh để trao cho bạn một tiền thưởng cho điều này một khi câu hỏi đủ điều kiện nhận tiền thưởng.
Giuseppe

@Giuseppe trở lại 59 byte! Tôi đã rất ngạc nhiên khi t()không phải sử dụng một is.nullbài kiểm tra trong các nỗ lực ban đầu của mình.
ngm

Không phải cuối cùng nó msẽ là null, vì vậy bạn có thể thay đổi câu lệnh if cho 54 byte . Có vẻ để làm việc cho các trường hợp thử nghiệm.
J.Doe


7

Bình thường , 9 byte

shMM.utC_

Hãy thử nó ở đây!

Làm sao?

shMM.utC_     Full program. Takes a 2D array (matrix) from STDIN.
    .u        Until a result that has occurred before is found, loop and collect...
        _     Reverse the matrix (reverse the order of its rows).
       C      Transpose.
      t       Remove first element.
 hMM          For each element in the resulting 3D array, get the heads of its elements.
s             Flatten.

Đó là mát mẻ. Là người mới bắt đầu Pyth, bây giờ tôi biết tôi có nhiều thứ để học,
ElPedro

5

Stax , 7 byte

ôQÖG·í<

Chạy và gỡ lỗi nó

Nó nhận một mảng các hàng trên một dòng và tạo đầu ra được phân tách bằng dòng mới.

Giải nén, không được chỉnh sửa và nhận xét, nó trông như thế này.

W       repeat the rest of the program until cancelled explicitly
  rM    rotate matrix *clock-wise* (yes, this is the opposite of the challenge)
  |c    assert matrix is truthy. (has rows) cancel otherwise.
  B     remove the top row of the matrix, and push separately to main stack
  rm    reverse the top row (this fixes the rotation direction), and print each value

Chạy cái này


4

Bình thường, 20 byte

J.TQWJ=+YhJ=J_.TtJ)Y

Hãy thử nó ở đây

Giải trình

J.TQWJ=+YhJ=J_.TtJ)Y
J.TQ                    Call the transposed input J.
    WJ            )     While J is not empty...
      =+YhJ             ... put the top row into Y (initially [])...
           =J   tJ      ... remove the top row...
             _.T        ... reverse and transpose (rotate clockwise).
                   Y    Output the result.

4

oK , 12 byte

*+,/(1_+|:)\

Hãy thử trực tuyến!

Điều này lạm dụng thực tế là oK dường như không quan tâm quá nhiều đến hình dạng cho sự hoán vị. Trong k này sẽ là 13 byte : *:',/(1_+|:)\.

       +|:   /reverse, then transpose (rotate right)
     1_      /remove first line
    (     )\ /fixpoint of the above, keeping intermediate results (scan)
  ,/         /concatenate all the rows
*+           /get the first element of each row

3

Sạch , 69 byte

import StdEnv,StdLib
? =transpose
@[h:t]=h++ @(reverse(?t))
@_=[]

@o?

Hãy thử trực tuyến!

Di chuyển hàng / cột tiếp theo vào đầu danh sách để mẫu có thể khớp với mẫu trong đối số.

Đối với ví dụ đầu tiên trong thử thách, nó trông giống như:

@o? [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
@ h=:[1, 5, 9, 13] t=:[[2, 6, 10, 14], [3, 7, 11, 15], [4, 8, 12, 16]]
[1, 5, 9, 13] ++ @ h=:[14, 15, 16] t=:[[10, 11, 12], [6, 7, 8], [2, 3, 4]]
[1, 6, 9, 13, 14, 15, 16] ++ @ h=:[12, 8, 4] t=:[[11, 7, 3], [10, 6, 2]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4] ++ @ h=:[3, 2] t=:[[7, 6], [11, 10]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2] ++ @ h=:[6, 10] t=:[[7, 11]]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10] ++ @ h=:[11, 7] t=:[]
[1, 6, 9, 13, 14, 15, 16, 12, 8, 4, 3, 2, 6, 10, 11, 7] ++ @ []

3

Julia 0,7 , 47 byte

f(m)=[m[:,1];sum(m)<1?[]:f(rotr90(m[:,2:end]))]

Hãy thử trực tuyến!

Julia có tích hợp tiện lợi để xoay ma trận 90 độ, loại bỏ sự cần thiết của các hoạt động chuyển đổi ngược.

Như bạn có thể thấy từ các cảnh báo của trình biên dịch, nó nhấn mạnh rằng tất cả các thành phần của điều kiện ternary nên được phân tách bằng khoảng trắng, và trong câu 1.0, điều này đã được thực thi.

Thật kỳ lạ, trong tình huống này, cách ngắn nhất mà tôi tìm thấy để thoát ra khỏi đệ quy là sử dụng khối thử bắt:

Julia 1.0 , 50 byte

f(m)=[m[:,1];try f(rotr90(m[:,2:end]))catch;[]end]

Hãy thử trực tuyến!


2

JavaScript (Node.js) , 89 byte

f=a=>a>[]?[...a.map(x=>x[0]),...f(a[0].map((_,i)=>a.map(y=>y[i]).reverse()).slice(1))]:[]

Hãy thử trực tuyến!

Lấy cột đầu tiên, hoán đổi cột còn lại sau đó đảo ngược từng hàng (= xoay ma trận 90 độ CW), rồi lặp lại cho đến khi mảng không còn mục nào nữa.


2

APL (Dyalog) , 24 22 byte

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}

Hãy thử trực tuyến!

Làm sao?

{×≢⍵:⍵[;1],∇⍉⊖0 1↓⍵⋄⍬}
{                    } - a function
 ×≢⍵:                  - if non-empty:
     ⍵[;1]             - the left column
          ,∇⍉⊖0 1↓⍵    - repeat this function without the left column, rotated counter clockwise
                   ⋄⍬  - otherwise, return an empty vector

Một lời giải thích của các nhà khai thác sẽ được tốt đẹp.
Arc676

1
@ Arc676, đã thêm!
Zacharý

2

05AB1E , 13 11 10 byte

ΔRøćRˆ}¯˜þ

-2 byte nhờ @Emigna .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Δ         # Loop until the stack no longer changes:
 R        #  Reverse the order of the rows
          #   i.e. [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
          #    → [[13,14,15,16],[9,10,11,12],[5,6,7,8],[1,2,3,4]]
  ø       #  Zip, swapping rows and column
          #   → [[13,9,5,1],[14,10,6,2],[15,11,7,3],[16,12,8,4]]
   ć      #  Head extracted
          #   → [[14,10,6,2],[15,11,7,3],[16,12,8,4]] and [13,9,5,1]
    R     #  Reverse this row
          #   → [1,5,9,13]
     ˆ    #  Pop and push it to the global array
}         # After the loop:
 ¯        #  Push the global array
          #   i.e. [[1,5,9,13],[14,15,16],[12,8,4],[3,2],[6,10],[11],[7],"",""]
  ˜       #  Flatten it
          #   → [1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7,"",""]
   þ      #  Remove all empty string by only leaving all digits
          #   → ["1","5","9","13","14","15","16","12","8","4","3","2","6","10","11","7"]
          # (and output it implicitly)


1

Than , 25 byte

≔⮌EA⮌ιθWθ«≔E§θ⁰⮌Eθ§μλθI⊟θ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔⮌EA⮌ιθ

Xoay đầu vào 180 °. Điều này là vì hai lý do: a) hàng cuối cùng là dễ xóa nhất và b) dễ lặp hơn nếu hàng bị xóa ở cuối vòng. (Tôi đã thử phản xạ và xuất ra theo chiều kim đồng hồ nhưng phải mất thêm một byte.)

Wθ«

Lặp lại cho đến khi mảng trống.

≔E§θ⁰⮌Eθ§μλθ

Xoay mảng bằng 90 °.

I⊟θ

Xóa hàng cuối cùng của mảng và in phần tử dưới dạng chuỗi trên các dòng riêng biệt.



1

PowerShell , 266 byte

Vâng .. PowerShell không phải là tốt nhất để xử lý ma trận. Nhưng, thuật toán về cơ bản giống như ở trên .. Mỗi hàng được biểu diễn dưới dạng một chuỗi được phân tách bằng dấu phẩy và về cơ bản chúng tôi thực hiện một phép quay và hoán vị cho mỗi lớp. Tôi có lẽ có thể cạo hơn hết, nhưng ... tôi đã có trong bộ đồ ngủ của tôi ...

Filter F{$a=$_-replace"],|]|\s",''-split'\['|?{$_-ne''};$b=@();while($a-ne $null){$N=($a[0]-split',').Count-1;$a=0..$N|%{$i=$_;($a|%{($_-split',')[$i]})-join','};if($d){[array]::Reverse($a)}if($N-gt0){$b+=$a[0];$a=$a[1..$N]}else{$b+=$a;$a=$null};$d=$true}$b-join','}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.