Для данной матрицы выведите представление матрицы, в которой верхний левый элемент находится сверху, антидиагональный - это центральная строка, а нижний правый элемент - внизу.
Например, рассмотрим следующую матрицу:
1 2 3
4 5 6
7 8 9
Алмазная версия этой матрицы:
1
4 2
7 5 3
8 6
9
Входы и выходы
Матрица ввода будет представлена в виде списка списков (или чего-либо подобного на выбранном вами языке). На выходе также должен быть список списков.
Матрицы будут содержать только натуральные числа.
Входная матрица не обязательно будет квадратной.
Входная матрица будет не менее 1 × 1.
Тестовые случаи
Input: [[1]]
Output: [[1]]
Input: [[1,2],[3,4]]
Output: [[1],[3,2],[4]]
Input: [[1,2,3],[4,5,6]]
Output: [[1],[4,2],[5,3],[6]]
Input: [[11,2,5],[3,99,3],[4,8,15],[16,23,42]]
Output: [[11],[3,2],[4,99,5],[16,8,3],[23,15],[42]]
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
code-golf
array-manipulation
matrix
Fatalize
источник
источник
Ответы:
J 7 байт
Это неназванный монадический глагол, который берет матрицу и возвращает список антидиагоналей:
Проверьте это здесь.
объяснение
/.
является встроенным в J, чтобы применить функцию к каждой анти-диагонали. К сожалению, эти антидиагонали даны в порядке, обратном тому, что мы хотим здесь.<@|.
, мы сначала применить|.
меняющий анти-диагонали , а затем<
в поле его (это единственный способ вернуть рваный массив в J, так как обычные массивы всегда прямоугольные, так antidiagonals будет дополнен нулями).источник
Python, 91 байт
Проверьте это на Ideone .
Python + NumPy, 69 байт
Ожидает двумерный массив NumPy в качестве входных данных и возвращает список массивов NumPy. Проверьте это на Ideone .
источник
Желе, 7 байт
Попробуйте онлайн!
объяснение
источник
Mathematica,
5856 байтАнонимная функция, принимает вложенные массивы.
источник
Length[#]
где
есть\[Transpose]
. И, вероятно, еще один из псевдонимовLength
.Length@#&@@#
для ASCII только при том же количестве байтов.CJam, 17 байт
Безымянный блок (функция), который ожидает матрицу в стеке и заменяет ее своими антидиагоналами.
Проверьте это здесь.
Это (найдено Sp3000) работает с тем же количеством байтов:
объяснение
Это лучше всего объяснить на примере. Рассмотрим вход:
источник
Python 2,
8887 байтПредварительно добавьте 0s, zip, затем удалите ложные элементы. Возвращает список кортежей. Это используется
map(None,...)
для выполненияzip_longest
(заполнение недостающими пятнамиNone
) иfilter(None,...)
для удаления ложных элементов.Досадно, что нам нужно добавить в
[]
строку дополнительную строку, чтобыmap
гарантировать возвращение списка кортежей, посколькуmap(None,*[[1]])
возвращается,[1]
а не[(1,)]
для матрицы 1x1.filter
Хотя лишний ряд удаляется .(Спасибо @Dennis за -1 байт)
источник
Рубин,
6866 байтАнонимная функция.
источник
Mathematica, 60 байт
где
символ Unicode, который Mathematica читает как постфиксный\[Transpose]
оператор.Это немного дольше, чем другое решение Mathematica, но я решил опубликовать его, потому что оно не использует
Diagonals
встроенный и использует совершенно другой подход.объяснение
Это сначала транспонирует матрицу (так, чтобы антидиагоналы появлялись в правильном порядке, если матрица была уплощена). Затем мы отображаем
List
ячейки матрицы вместе с индексом, который превращает каждый элемент матрицыi
в{i, {x, y}}
гдеx
иy
являются координатами элемента в матрице.Это выравнивает самое внешнее измерение, так что теперь у нас есть плоский список матричных элементов (с их координатами) в главном порядке столбцов.
Это группирует эти элементы по сумме их координат. Обратите внимание, что антидиагоналы являются линиями констант
x+y
, так что это именно та группировка, которую мы хотим. Порядок в каждой группе сохраняется. Теперь нам просто нужно снова избавиться от координат. Это делается с помощью довольно загадочного:Это отображает функцию
#&@@@#&
на каждую группу, которая сама применяется#&
к каждому элементу в группе и#
является просто первым аргументом, то есть исходным матричным элементом.источник
читается как\[transpose]
?T
: reference.wolfram.com/language/ref/character/Transpose.html ...\[Transpose]
просто транслитерация ASCII этого символа Unicode. Копирование символа Unicode или транслитерации в Mathematica будет работать.Октава, 77 байт
С небольшим злоупотреблением
accumarray
функцией:Это определяет анонимную функцию. Чтобы использовать его, присвойте переменную или используйте
ans
.Ввод - это матрица с
:
разделителем строк. Выход - это массив ячеек, содержащий массив для каждой строки (октавный эквивалент для зубчатых массивов). Это отображается в Octave с указанием индексов массива ячеек и содержимого каждой ячейки. Попробуй это здесь .Для отображения результата, разделенного только пробелами и символами новой строки: 83 байта
Вы также можете попробовать это здесь .
источник
JavaScript (Firefox),
8675 байтСохранено 11 байтов благодаря @Neil!
Работает в Firefox 30+. Принимает массив массивов.
источник
a.concat(a[0]).slice(1)
чтобы получить массив правильной длины. Кроме того,[for(of)]
это не ES6; Я обычно пишу это как (Firefox 30+) или что-то подобное.concat
иslice
. Благодарность!Октава,
6362 байтаУдалил один байт благодаря
@DonMue ...@LuisMendo!Я пошел по скучному маршруту и проглотил антидиагоналы.
Пробный прогон на идеоне .
источник
'uni'
до'un'
Haskell,
8382 байтаНими спасла байт. Благодарность!
источник
Python, 128 байт (numpy)
источник
lambda
просто лямбду, которую вы можете использовать в качестве представления.lambda A:[[A[U][I-U]for U in range(max(I-len(A)+1,0),min(len(A[0])-1,I)+1)]for I in range(len(A+A[0])-1)]
(как в вашей первоначальной ревизии) будет немного короче. Кроме того, вы должны перейтиA[U][I-U]
к,A[I-U][U]
чтобы получить ориентацию из вопроса.Pyth ,
4117 байтПопробуйте онлайн!
Вдохновленный решением @ Doorknob другой проблемы .
Как это устроено:
Предыдущая попытка:
Попробуйте онлайн!
Как это устроено:
источник
Groovy,
777375Принимает массив массивов в качестве входных данных и возвращает массив массивов.
Попытайся
РЕДАКТИРОВАТЬ: я забыл вывести anwser, после добавления его оценка достигает 75.
источник