Обертайте антидіагоналі


32

Фон

У більшості розумних мов програмування обертати рядки або стовпці 2D масиву дуже просто. У цьому виклику ваше завдання - повернути антидіагоналі замість цього. Нагадаємо, що антидіагоналі двовимірного масиву - це його 1D зрізи, взяті у північно-східному напрямку ↗.

Вхідні дані

Непорожній прямокутний 2D масив одноцифрових чисел у будь-якому розумному форматі. Зауважте, що масив може бути не квадратом.

Вихід

Той самий масив, але з кожною антидіагоналлю повертається на один крок вправо.

Приклад

Розглянемо 3x4вхідний масив

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

Антидіагоналі цього масиву є

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

Їх обертові версії є

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

Таким чином, правильний вихід

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

Правила та оцінка

Ви можете написати повну програму або функцію. Також прийнятно написати функцію, яка змінює вхідний масив на місці, якщо ваша мова дозволяє це. Виграє найменший кількість байтів, а стандартні лазівки заборонені.

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N bytes

де Nрозмір вашого подання. Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат - це сума двох файлів, або ви хочете окремо перерахувати штрафні санкції для перекладача або хочете показати старі бали, які ви покращили), переконайтеся, що фактичний результат - це останнє число в заголовку.

Додаткові тестові випадки

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 

Відповіді:


20

CJam, 20

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

Написано як функціональний блок. Спробуйте в Інтернеті

Пояснення:

Вхід можна розглядати так:

вхідна схема

Тобто, відокремлюємо верхній рядок і правий стовпець від решти матриці і вважаємо ті елементи в порядку, показаному стрілкою.

Тоді вихід такий:

вихідна діаграма

Залишився прямокутний блок переміщується по діагоналі в цілому, а елементи краю переставляються в порядку / положеннях, показаних новою стрілкою.

Код робить майже точно це, за винятком того, що вихід спочатку генерується стрілкою, що йде прямо вниз (тому матриця має хвіст, як літера P), а потім виправляється.

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 - це також 20 байт, але ваша була раніше, тому я її приймаю.
Згарб

9

CJam, 44 43 42 40 байт

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

Тестуйте це тут.

Хм, набагато краще, ніж моя перша спроба, але я маю відчуття, що Денніс все одно вирішить це набагато менше ...

Вхід і вихід є такими як сітки ASCII:

0123
4567
8901

дає

0456
1890
2371


3
@TimmyD Я повинен був зачекати до кінця пільгового періоду, щоб відредагувати його з 47 аж до 43.: P
Мартін Ендер

Так! Це стало мемом .
intrepidcoder

1
Я НАРЕШЧО пішов і вивчив мову гольфу, щоб я міг
гольфувати

6

J, 24 char

Функція, що приймає один аргумент.

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

J має оператора /.під назвою Oblique . Він не може його інвертувати, тому реконструкція не є тривіальною, але ви можете розглядати "перелік косих" як перестановку елементів масиву. Отже, ми перевертаємо цю перестановку /:(діадічний Сортування ), ставлячи перестановку "перелік косих" для цього розміру ( </.@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

Спробуйте в Інтернеті.


Це пік Дж саме тут. Молодці.
Йона

5

J, 38 30 байт

8 байт збережено завдяки @algorithmshark.

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

Функція збирає верхній і лівий краї в список, розрізає список на два шматки достатнього розміру і зшиває їх праворуч і внизу основної частини.

Використання:

   ]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

Спробуйте його онлайн тут.


1
Аж до 30 знаків: {./.Замінює }:@{.,{:"1, і ви можете зберегти дві тильди, клацаючи на поїзд навколо: {./.((}.~#),~({.~#),.])}:"1@}..
алгоритм

4

Юлія, 153 149 139 байт

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)

Це створює неназвану функцію, яка приймає масив і повертає введений масив, змінений на місце.

Безголівки:

# 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

Дякуємо Мартіну Бюттнеру за алгоритмічну пораду та за збереження 4 байтів!


3

ES6, 75 байт

Це приймає масив масивів як параметр і змінює його на місці.

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

Безголівки:

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
}

Щоб отримати додаткові роз'яснення, див. Схему @ aditsu.


Ви можете зберегти 2 байти, змінивши {t.push(r.pop());r.unshift(t.shift())}наt.push(r.pop())+r.unshift(t.shift())
user81655

3

Pyth, 20 байт

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

Використовує підхід Адісту, щоб видалити верхній рядок і правий стовпчик, а потім наклеїти їх ліворуч і знизу. Але із змінними структурами даних, а не з транспозиціями.


2

Октава, 85 байт

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

Я сподіваюся, що я міг би позбутися від ends.


1

Python 2 , 113 104 94 байт

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]

Спробуйте в Інтернеті!

Це досить буквальне тлумачення методу @ aditsu. Синтаксис Python для обробки порожніх списків як False допоміг зберегти зайві 10 байт.


врятував 8 байт, відкинувши рядки, як я йду
SmileAndNod


1
Ви , напевно , не потрібен 0в[0:1]
Джо Кінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.