Putar anti-diagonal

32

Latar Belakang

Dalam sebagian besar bahasa pemrograman yang masuk akal, sangat mudah untuk memutar baris atau kolom array 2D. Dalam tantangan ini, tugas Anda adalah memutar anti-diagonal sebagai gantinya. Ingatlah bahwa anti-diagonal array 2D adalah irisan 1D-nya yang diambil ke arah timur laut ↗.

Memasukkan

Larik 2D persegi panjang non-kosong nomor tunggal digit dalam format apa pun yang masuk akal. Perhatikan bahwa array mungkin bukan persegi.

Keluaran

Array yang sama, tetapi dengan masing-masing anti-diagonal diputar satu langkah ke kanan.

Contoh

Pertimbangkan 3x4array input

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

Anti-diagonal array ini adalah

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

Versi rotasinya adalah

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

Dengan demikian output yang benar adalah

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

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Menulis fungsi yang memodifikasi larik input juga dapat diterima, jika bahasa Anda memungkinkan. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file, atau Anda ingin membuat daftar penalti penterjemah secara terpisah, atau Anda ingin menunjukkan skor lama yang Anda tingkatkan), pastikan skor aktual adalah angka terakhir di header.

Kasus uji tambahan

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 
Zgarb
sumber

Jawaban:

20

CJam, 20

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

Ditulis sebagai blok fungsi. Cobalah online

Penjelasan:

Input dapat dilihat seperti ini:

diagram input

Yaitu, kami memisahkan baris atas dan kolom kanan dari sisa matriks, dan mempertimbangkan elemen-elemen tersebut dalam urutan yang ditunjukkan oleh panah.

Maka outputnya seperti ini:

diagram keluaran

Blok persegi panjang yang tersisa dipindahkan secara diagonal secara keseluruhan, dan elemen tepi disusun ulang dalam urutan / posisi yang ditunjukkan oleh panah baru.

Kode melakukan hampir persis seperti itu, kecuali output pertama kali dihasilkan dengan panah lurus ke bawah (sehingga matriks memiliki ekor, seperti huruf P), kemudian diperbaiki.

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
aditsu
sumber
Jawaban Pyth juga 20 byte, tetapi milik Anda lebih awal, jadi saya menerimanya.
Zgarb
9

CJam, 44 43 42 40 byte

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

Uji di sini.

Hmm, jauh lebih baik daripada upaya pertamaku, tapi aku punya firasat Dennis akan menyelesaikan ini dengan lebih sedikit lagi ...

Input dan output adalah sebagai kisi ASCII:

0123
4567
8901

memberi

0456
1890
2371
Martin Ender
sumber
3
@TimmyD Saya harus menunggu sampai akhir masa tenggang untuk mengeditnya dari 47 hingga 43.: P
Martin Ender
Iya nih! Itu menjadi meme .
intrepidcoder
1
SAYA AKHIRNYA pergi dan belajar bahasa golf sehingga saya bisa bermain golf 4 byte hingga 3 dan bergabung dengan rantai tautan :)
Khuldraeseth na'Barya
6

J, 24 char

Berfungsi mengambil satu argumen.

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

J memiliki operator /.bernama Oblique . Itu tidak bisa membalikkannya, jadi rekonstruksi tidak sepele, tetapi Anda dapat mempertimbangkan "daftar miring" sebagai permutasi dari elemen-elemen array. Jadi kita membalikkan permutasi itu dengan /:( Urutkan diad ), dengan menempatkan permutasi "daftar miring" untuk ukuran itu ( </.@i.@$) di sebelah kanan dan nilai miring baru kami, diputar dengan benar, di sebelah kiri. Kemudian kita membentuk kembali daftar ini menjadi array persegi panjang yang lama menggunakan yang baik $$.

   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

Cobalah online.

algoritme hiu
sumber
Ini puncak J di sini. Sudah selesai dilakukan dengan baik.
Jonah
5

J, 38 30 byte

8 byte disimpan berkat @algorithmshark.

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

Fungsi mengumpulkan tepi atas dan kiri ke dalam daftar, memotong daftar menjadi dua potong dengan ukuran yang cukup dan menjahitnya ke kanan dan bawah bagian inti.

Pemakaian:

   ]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

Cobalah online di sini.

randomra
sumber
1
Ke 30 Char: {./.Menggantikan }:@{.,{:"1, dan Anda dapat menyimpan dua tildes dengan membalik kereta sekitar: {./.((}.~#),~({.~#),.])}:"1@}..
algorithmshark
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)

Ini menciptakan fungsi tanpa nama yang menerima larik dan mengembalikan larik masukan yang dimodifikasi pada tempatnya.

Tidak Disatukan:

# 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

Terima kasih kepada Martin Büttner untuk saran algoritmik dan untuk menghemat 4 byte!

Alex A.
sumber
3

ES6, 75 byte

Ini menerima array array sebagai parameter dan memodifikasinya di tempat.

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

Tidak Disatukan:

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
}

Lihat diagram @ aditsu untuk klarifikasi lebih lanjut.

Neil
sumber
Anda dapat menyimpan 2 byte dengan mengubah {t.push(r.pop());r.unshift(t.shift())}ket.push(r.pop())+r.unshift(t.shift())
user81655
3

Pyth, 20 byte

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

Menggunakan pendekatan Adistu untuk menghapus baris atas dan kolom kanan, kemudian menempelkannya di kiri dan bawah. Tetapi dengan struktur data yang bisa berubah, bukan transposisi.

isaacg
sumber
2

Oktaf, 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)]]

Saya harap saya bisa menyingkirkan enditu.

alephalpha
sumber
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]

Cobalah online!

Ini adalah interpretasi yang cukup literal dari metode @ aditsu. Sintaksis Python untuk menangani daftar kosong karena False membantu menghemat 10 byte tambahan.

SmileAndNod
sumber
disimpan 8 byte dengan membuang baris saat saya pergi
SmileAndNod
1
Anda mungkin tidak perlu 0di[0:1]
Jo King