Xoay các đường chéo


32

Lý lịch

Trong hầu hết các ngôn ngữ lập trình hợp lý, rất dễ dàng để xoay các hàng hoặc cột của mảng 2D. Trong thử thách này, nhiệm vụ của bạn là xoay các đường chéo thay thế. Hãy nhớ lại rằng các đường chéo của một mảng 2D là các lát 1D của nó được lấy theo hướng đông bắc.

Đầu vào

Một mảng 2D hình chữ nhật không trống gồm các số có một chữ số ở bất kỳ định dạng hợp lý nào. Lưu ý rằng mảng có thể không phải là một hình vuông.

Đầu ra

Cùng một mảng, nhưng với mỗi đường chéo xoay một bước sang phải.

Thí dụ

Xem xét 3x4mảng đầu vào

0 1 2 3
4 5 6 7
8 9 0 1

Các đường chéo của mảng này là

0
4 1
8 5 2
9 6 3
0 7
1

Phiên bản xoay của họ là

0
1 4
2 8 5
3 9 6
7 0
1

Do đó, đầu ra đúng là

0 4 5 6
1 8 9 0
2 3 7 1

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Bạn cũng có thể chấp nhận viết một hàm sửa đổi mảng đầu vào, nếu ngôn ngữ của bạn cho phép điều đó. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên hoặc bạn muốn hiển thị điểm số cũ mà bạn đã cải thiện), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề.

Các trường hợp kiểm tra bổ sung

Input:
4
Output:
4

Input:
5 6 1
Output:
5 6 1

Input:
0 1
6 2
Output:
0 6
1 2

Input:
6 3 0 8
4 6 1 4
6 2 3 3
9 3 0 3
Output:
6 4 6 1
3 6 2 3
0 9 3 0
8 4 3 3

Input:
5 8 2
6 7 3
2 6 1
6 0 6
6 4 1
Output:
5 6 7
8 2 6
2 6 0
3 6 4
1 6 1

Input:
9 9 4 0 6 2
2 3 2 6 4 7
1 5 9 3 1 5
0 2 6 0 4 7
Output:
9 2 3 2 6 4
9 1 5 9 3 1
4 0 2 6 0 4
0 6 2 7 5 7 

Câu trả lời:


20

CJam, 20

{z_)\zLa+(@+\.+s\,/}

Viết dưới dạng khối chức năng. Dùng thử trực tuyến

Giải trình:

Đầu vào có thể được xem như thế này:

sơ đồ đầu vào

Đó là, chúng tôi tách hàng trên cùng và cột bên phải khỏi phần còn lại của ma trận và xem xét các phần tử đó theo thứ tự được hiển thị bởi mũi tên.

Sau đó, đầu ra là như thế này:

sơ đồ đầu ra

Khối hình chữ nhật còn lại được di chuyển theo đường chéo như một tổng thể và các phần tử cạnh được sắp xếp lại theo thứ tự / vị trí được hiển thị bởi mũi tên mới.

Mã thực hiện gần như chính xác điều đó, ngoại trừ đầu ra được tạo ra đầu tiên với mũi tên đi thẳng xuống (vì vậy ma trận có đuôi, giống như chữ P), sau đó được sửa.

z      zip (transpose) the matrix
_      make a copy
)      take out the last row (right column before transposing)
\      swap with the rest of the matrix
z      transpose back
La+    append an empty row (needed for the single-column case,
        which leaves an empty matrix here)
(      take out the first row (top row without the corner)
@+     bring the right column to the top of the stack and concatenate
        obtaining an array of the edge elements (marked with the blue arrow)
\      swap with the remaining part (big white block in the diagrams)
.+     concatenate element by element
        each edge element is concatenated with a row of the white block
        after the white block runs out, the remaining elements form new rows
s      convert the whole thing to a string (concatenating all rows)
\      swap with the copy of the transposed matrix
,      get its length (number of original columns)
/      split the string into rows of that length

Câu trả lời Pyth cũng là 20 byte, nhưng câu trả lời của bạn đã sớm hơn, vì vậy tôi chấp nhận nó.
Zgarb 7/12/2015

9

CJam, 44 43 42 40 byte

qN/:ReeSf.*:sz1fm<{Rz,{(S-(o\}*~]{},No}h

Kiểm tra nó ở đây.

Hmm, tốt hơn nhiều so với lần thử đầu tiên của tôi, nhưng tôi có cảm giác Dennis sẽ giải quyết vấn đề này ít hơn nhiều ...

Đầu vào và đầu ra là lưới ASCII:

0123
4567
8901

cho

0456
1890
2371


3
@TimmyD Tôi nên đợi cho đến khi kết thúc thời gian ân hạn để chỉnh sửa nó từ 47 xuống còn 43 .: P
Martin Ender

Vâng! Nó trở thành một meme .
intrepidcoder

1
Tôi
HOÀN TOÀN

6

J, 24 char

Hàm lấy một đối số.

$$<@(1&|.)/./:&;</.@i.@$

J có một toán tử /.gọi là Xiên . Nó không thể đảo ngược nó, vì vậy việc xây dựng lại không tầm thường, nhưng bạn có thể coi "liệt kê danh sách" là một hoán vị của các thành phần của mảng. Vì vậy, chúng tôi đảo ngược hoán vị đó với /:( Sắp xếp dyadic ), bằng cách đặt hoán vị "liệt kê liệt kê" cho kích thước đó ( </.@i.@$) ở bên phải và các giá trị xiên mới của chúng tôi, được xoay đúng, ở bên trái. Sau đó, chúng tôi định hình lại danh sách này vào mảng hình chữ nhật cũ bằng cách sử dụng cũ $$.

   3 4$i.10
0 1 2 3
4 5 6 7
8 9 0 1
   ($$<@(1&|.)/./:&;</.@i.@$) 3 4$i.10
0 4 5 6
1 8 9 0
2 3 7 1

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


Đây là đỉnh J ngay tại đây. Làm tốt.
Giô-na

5

J, 38 30 byte

8 byte được lưu nhờ vào @alerskymshark.

{./.((}.~#),~({.~#),.])}:"1@}.   

Hàm thu thập các cạnh trên và trái vào một danh sách, cắt danh sách thành hai mảnh có kích thước đủ và khâu chúng vào bên phải và dưới cùng của phần lõi.

Sử dụng:

   ]input=.0 1 2 3, 4 5 6 7,: 8 9 0 1
0 1 2 3
4 5 6 7
8 9 0 1
   ({./.((}.~#),~({.~#),.])}:"1@}.) input
0 4 5 6
1 8 9 0
2 3 7 1

Hãy thử trực tuyến tại đây.


1
Xuống tới 30 char: {./.thay thế }:@{.,{:"1và bạn có thể lưu hai dấu ngã bằng cách lật tàu xung quanh : {./.((}.~#),~({.~#),.])}:"1@}..
thuật toán

4

Julia, 153 149 139 byte

A->(length(A)>1&&((m,n)=size(A);r(X)=for i=1:n X[:,i]=reverse(X[:,i])end;r(A);for i=-m:m A[diagind(A,i)]=circshift(diag(A,i),1)end;r(A));A)

Điều này tạo ra một hàm không tên chấp nhận một mảng và trả về mảng đầu vào được sửa đổi tại chỗ.

Ung dung:

# Create a function to reverse the columns of a matrix
function revcols!(X)
    for = 1:size(X, 2)
        X[:,i] = reverse(X[:,i])
    end
    return X
end

# Our main function
function zgarb!(A)
    # Only perform operations if the array isn't one element
    if length(A) > 1
        # Record the number of rows
        m = size(A, 1)

        # Reverse the columns in place
        revcols!(A)

        # Shift each diagonal
        for i = -m:m
            A[diagind(A, i)] = circshift(diag(A, i), 1)
        end

        # Reverse the columns back
        revcols!(A)
    end
    return A
end

Cảm ơn Martin Büttner đã tư vấn thuật toán và tiết kiệm 4 byte!


3

ES6, 75 byte

Điều này chấp nhận một mảng các mảng như là một tham số và sửa đổi nó tại chỗ.

a=>{t=a.shift();a.map(r=>{t.push(r.pop());r.unshift(t.shift())});a.push(t)}

Ung dung:

function anti_diagonal(array) {
    var temp = array.shift(); // strip off the first row
    array.forEach(row => temp.push(row.pop())); // strip off the last elements of each row
    array.forEach(row => row.unshift(temp.shift())); // distribute the elements to the beginning of each row
    array.push(temp); // the remaining elements become the last row
}

Xem sơ đồ của @ aditsu để biết thêm.


Bạn có thể lưu 2 byte bằng cách thay đổi {t.push(r.pop());r.unshift(t.shift())}thànht.push(r.pop())+r.unshift(t.shift())
user81655

3

Bình thường, 20 byte

J+PhQ.)MQ++L.(J0tQ]J

Sử dụng phương pháp của Adistu trong việc loại bỏ hàng trên cùng và cột bên phải, sau đó dán chúng ở bên trái và bên dưới. Nhưng với cấu trúc dữ liệu có thể thay đổi, không phải chuyển vị.


2

Octave, 85 byte

@(a)[(b=[a(1,1:end),a(2:end,end)'])(1:(s=size(a)(1)))',[a(2:end,1:end-1);b(s+1:end)]]

Tôi hy vọng tôi có thể thoát khỏi ends.


1

Python 2 , 113 104 94 byte

f=lambda i,b=[]:i and[b and b[:1]+i[0][:-1]]+f(i[1:],b[1:]or i[0][:-1]+[l[-1]for l in i])or[b]

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

Đây là một cách giải thích khá chính xác về phương pháp của @ aditsu. Cú pháp của Python để xử lý các danh sách trống là Sai giúp tiết kiệm thêm 10 byte.


đã lưu 8 byte bằng cách loại bỏ các hàng khi tôi đi
SmileAndNod


1
Bạn có thể không cần 0trong[0:1]
Jo King
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.