Поверните анти-диагонали


32

Задний план

В большинстве разумных языков программирования очень легко вращать строки или столбцы двумерного массива. В этом задании ваша задача - вместо этого вращать антидиагоналы . Напомним, что антидиагоналами двумерного массива являются его одномерные срезы, взятые в северо-восточном направлении ↗.

вход

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

Выход

Тот же массив, но с каждой анти-диагональю повернутой на один шаг вправо.

пример

Рассмотрим 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

Правила и оценки

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

Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## 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 символа

Функция принимает один аргумент.

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

У J есть оператор с /.именем Oblique . Он не может инвертировать его, поэтому реконструкция не тривиальна, но вы можете рассматривать «перечисление наклонов» как перестановку элементов массива. Таким образом, мы инвертируем эту перестановку с помощью /:(двоичной сортировки ), помещая перестановку «list obliques» для этого размера ( </.@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

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


Это пик J прямо здесь. Отлично сработано.
Иона

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)

Это создает безымянную функцию, которая принимает массив и возвращает модифицированный входной массив на месте.

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

Спасибо Мартину Бюттнеру за алгоритмический совет и за сохранение 4 байта!


3

ES6, 75 байт

Это принимает массив массивов в качестве параметра и изменяет его на месте.

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
}

Смотрите диаграмму @ 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

Использует подход Adistu, заключающийся в удалении верхнего ряда и правого столбца, а затем прикреплении их слева и снизу. Но с изменяемыми структурами данных, а не с транспозициями.


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

Я надеюсь, что смогу избавиться от endс.


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.