Köşegenleri döndür


32

Arka fon

En makul programlama dillerinde, 2B dizinin satırlarını veya sütunlarını döndürmek çok kolaydır. Bu zorlukta, göreviniz bunun yerine köşegenleri döndürmektir . Bir 2D dizisinin anti-köşegenlerinin kuzeydoğu yönünde 1 alınan 1D dilimleri olduğunu hatırlayın.

Giriş

Herhangi bir makul formatta, boş olmayan dikdörtgen bir 2D tek basamaklı sayı dizisi. Dizinin bir kare olmayabileceğini unutmayın.

Çıktı

Aynı dizi, ancak her anti-diyagonal ile bir adım sağa döndürülmüş.

Örnek

3x4Giriş dizisini göz önünde bulundurun

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

Bu dizinin köşegenleri

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

Döndürülmüş versiyonları

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

Böylece doğru çıktı

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

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. Diliniz izin veriyorsa, giriş dizisini değiştiren bir işlev yazmak da kabul edilebilir. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez.

Liderler Sıralaması

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğinizden veya geliştirdiğiniz eski puanları göstermek istediğinizden), gerçek puanın alındığından emin olun. bir son başlıkta sayısı.

Ek test durumları

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 

Yanıtlar:


20

CJam, 20

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

Bir fonksiyon bloğu olarak yazılmıştır. Çevrimiçi deneyin

Açıklama:

Giriş şu şekilde görülebilir:

giriş diyagramı

Yani, üst satır ve sağ sütunu matrisin geri kalanından ayırırız ve bu öğeleri okla gösterilen sırayla dikkate alırız.

O zaman çıktı şöyle:

çıkış diyagramı

Kalan dikdörtgen blok bir bütün olarak çapraz olarak hareket eder ve kenar elemanları yeni okun gösterdiği sıraya / pozisyona göre yeniden düzenlenir.

Kod, çıktının ilk önce ok aşağıya inmesiyle (matrisin P harfi gibi bir kuyruğu olması) sonra da düzeltilmesi dışında neredeyse aynısını yapar.

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

Pyth cevabı da 20 bayttır, fakat sizinki daha önceydi, bu yüzden kabul ediyorum.
Zgarb

9

CJam, 44 43 42 40 bayt

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

Burada test et.

Hmm, ilk denememden çok daha iyi, ama Dennis'in bunu daha az çözeceğini hissediyorum.

Giriş ve çıkış ASCII ızgaraları gibidir:

0123
4567
8901

verir

0456
1890
2371


3
@TimmyD Ödemesiz dönemin sonuna kadar 47'den 43'e kadar düzenlemek için beklemeliydim.: P
Martin Ender

Evet! Bu bir meme oldu .
intrepidcoder

1
Nihayet gittim ve bir golf dili öğrendim, böylece 3'e 4 byte golf oynayabilir ve link zincirine katılabileyim :)
Khuldraeseth na'Barya

6

J, 24 karakter

Bir argüman alarak işlev.

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

J'nin Eğik/. adında bir operatör var . Bunu tersine çeviremez, bu yüzden yeniden yapılanma önemsiz değildir, ancak dizilerin öğelerinin müsaadesi olarak "oblikleri listelemek" olarak düşünebilirsiniz. Bu yüzden (dyadic Sort ) ile bu izni tersine çeviriyoruz; bu boyut için "listeleme eğrileri" permütasyonunu sağa ve yeni eğik değerlerimiz, doğru şekilde sola döndürdüler. Sonra bu listeyi iyi eski kullanarak eski dikdörtgen dizisine yeniden şekillendiririz ./:</.@i.@$$$

   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

Çevrimiçi deneyin.


Bu tam burada tepe J. Aferin.
Jonah

5

J, 3830 bayt

@Algorithmshark sayesinde 8 bayt kurtarıldı.

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

Fonksiyon, üst ve sol kenarları bir listeye toplar, listeyi yeterli büyüklükteki iki parçaya böler ve onları çekirdek parçanın sağına ve altına diker.

Kullanımı:

   ]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

Burada çevrimiçi deneyin.


1
30 karakter için Aşağı: {./.cümledeki }:@{.,{:"1ve çevresinde bir tren saygısız iki tilde kaydedebilirsiniz: {./.((}.~#),~({.~#),.])}:"1@}..
algorithmshark

4

Julia, 153 149 139 bayt

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)

Bu, bir diziyi kabul eden ve yerinde değiştirilen giriş dizisini döndüren adsız bir işlev oluşturur.

Ungolfed:

# 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

Martin Büttner'e algoritmik tavsiye ve 4 byte tasarruf için teşekkürler!


3

ES6, 75 bayt

Bu, bir dizi dizisini parametre olarak kabul eder ve yerinde değiştirir.

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

Ungolfed:

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
}

Daha fazla açıklama için @ aditsu'nın diyagramına bakınız.


Sen değiştirerek 2 bayt kurtarabilir {t.push(r.pop());r.unshift(t.shift())}içint.push(r.pop())+r.unshift(t.shift())
user81655

3

Pyth, 20 bayt

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

Adistu'nun üst sıra ve sağ sütunu kaldırma, ardından sola ve alt tarafa yapıştırma yaklaşımını kullanır. Ancak değişken veri yapıları ile transpozisyonları değil.


2

Oktav, 85 bayt

@(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)]]

Umarım onlardan kurtulabilirim end.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.