Obróć anty-przekątne


32

tło

W najbardziej rozsądnych językach programowania bardzo łatwo jest obracać wiersze lub kolumny tablicy 2D. W tym wyzwaniu Twoim zadaniem jest obrócenie przeciw przekątnych . Przypomnij sobie, że przeciw przekątnymi macierzy 2D są jej wycinki 1D wykonane w kierunku północno-wschodnim ↗.

Wkład

Niepusta prostokątna tablica 2D liczb jednocyfrowych w dowolnym rozsądnym formacie. Pamiętaj, że tablica nie może być kwadratem.

Wydajność

Taki sam układ, ale z każdym anty-przekątnym obróconym o jeden krok w prawo.

Przykład

Rozważ 3x4tablicę wejściową

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

Anty-przekątne tego układu są

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

Ich obrócone wersje to

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

Zatem prawidłowe wyjście to

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

Zasady i punktacja

Możesz napisać pełny program lub funkcję. Dopuszczalne jest również napisanie funkcji, która modyfikuje tablicę wejściową, jeśli Twój język na to pozwala. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza lub chcesz pokazać stare wyniki, które poprawiłeś), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku.

Dodatkowe przypadki testowe

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 

Odpowiedzi:


20

CJam, 20

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

Zapisany jako blok funkcyjny. Wypróbuj online

Wyjaśnienie:

Dane wejściowe można wyświetlić w następujący sposób:

schemat wejściowy

Oznacza to, że oddzielamy górny wiersz i prawą kolumnę od reszty macierzy i rozważamy te elementy w kolejności pokazanej przez strzałkę.

Wynik jest następujący:

schemat wyjściowy

Pozostały prostokątny blok jest przesuwany po przekątnej jako całość, a elementy krawędzi są przestawiane w kolejności / pozycjach pokazanych przez nową strzałkę.

Kod robi to prawie dokładnie, z tym wyjątkiem, że wynik jest najpierw generowany ze strzałką skierowaną prosto w dół (więc macierz ma ogon, jak litera P), a następnie poprawiany.

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

Odpowiedź Pytha ma również 20 bajtów, ale twoja była wcześniejsza, więc ją akceptuję.
Zgarb,

9

CJam, 44 43 42 40 bajtów

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

Sprawdź to tutaj.

Hmm, znacznie lepiej niż moja pierwsza próba, ale mam wrażenie, że Dennis i tak rozwiąże to znacznie mniej ...

Dane wejściowe i wyjściowe są jak siatki ASCII:

0123
4567
8901

daje

0456
1890
2371


3
@ TimmyD Powinienem był poczekać do końca okresu karencji, aby edytować go od 47 aż do 43.: P
Martin Ender

Tak! Stało się memem .
intrepidcoder,

1
WRESZCIE poszedłem i nauczyłem się golfa, więc mogłem grać w golfa od 4 bajtów do 3 i dołączyć do łańcucha linków :)
Khuldraeseth na'Barya

6

J, 24 char

Funkcja przyjmująca jeden argument.

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

J ma operator o /.nazwie Oblique . Nie może go odwrócić, więc rekonstrukcja nie jest trywialna, ale można rozważyć „listowanie ukośnych” jako permutację elementów tablicy. Więc odwracamy tę permutację za pomocą /:( Sortowanie dynamiczne ), umieszczając permutację „listowanie ukośnych” dla tego rozmiaru ( </.@i.@$) po prawej stronie, a nasze nowe wartości ukośne, odpowiednio obrócone, po lewej stronie. Następnie przekształcamy tę listę w starą prostokątną tablicę za pomocą starej dobrej $$.

   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

Wypróbuj online.


To jest szczyt J właśnie tutaj. Dobra robota.
Jonasz

5

J, 38 30 bajtów

8 bajtów zapisanych dzięki @al algorytmshark.

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

Funkcja zbiera górną i lewą krawędź w listę, przycina listę do dwóch kawałków o wystarczających rozmiarach i zszywa je z prawej i dolnej części rdzenia.

Stosowanie:

   ]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

Wypróbuj online tutaj.


1
W dół do 30 Znak: {./.replaces }:@{.,{:"1i można zapisać dwie tyldy przez przerzucanie pociągiem wokół: {./.((}.~#),~({.~#),.])}:"1@}..
algorytmshark,

4

Julia, 153 149 139 bajtów

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)

Spowoduje to utworzenie nienazwanej funkcji, która akceptuje tablicę i zwraca zmodyfikowaną tablicę wejściową.

Nie golfowany:

# 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

Podziękowania dla Martina Büttnera za porady algorytmiczne i oszczędność 4 bajtów!


3

ES6, 75 bajtów

To akceptuje tablicę tablic jako parametr i modyfikuje ją w miejscu.

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

Nie golfowany:

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
}

Aby uzyskać dodatkowe wyjaśnienia, zobacz diagram @ aditsu.


Możesz zapisać 2 bajty, zmieniając {t.push(r.pop());r.unshift(t.shift())}nat.push(r.pop())+r.unshift(t.shift())
user81655

3

Pyth, 20 bajtów

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

Wykorzystuje podejście Adistu do usunięcia górnego wiersza i prawej kolumny, a następnie przyklejenia ich po lewej i na dole. Ale ze zmiennymi strukturami danych, a nie transpozycjami.


2

Oktawa, 85 bajtów

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

Mam nadzieję, że uda mi się go pozbyć end.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.