Вдохновлено Скопировано из этого вопроса в Stack Overflow.
Учитывая матрицу A
, создайте матрицу B
так, чтобы столбцы A
были расположены по диагонали блоков. Например, учитывая
1 2 3
4 5 6
выход будет
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
правила
Вход и выход могут быть в форме 2D-массивов, вложенных массивов или строк с различными разделителями для строк и столбцов.
Числа на входе (матрица A
) будут положительными целыми числами.
Разрешен унарный формат, если нули в выводе отображаются каким-либо разумным способом. Например, приведенный выше результат может отображаться с использованием кавычек для включения каждого числа:
'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'
Контрольные примеры
Ввод, вывод:
1 2 3
4 5 6
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
10 20
10 0
0 20
10
20
10
20
1 2 3
10 20 30
100 200 300
1 0 0
10 0 0
100 0 0
0 2 0
0 20 0
0 200 0
0 0 3
0 0 30
0 0 300
2 4
6 8
10 12
2 0
6 0
10 0
0 4
0 8
0 12
code-golf
number
array-manipulation
Луис Мендо
источник
источник
Ответы:
MATL , 6 байтов
Работает в текущей версии (13.0.0) языка / компилятора.
Ввод имеет следующую форму с точкой с запятой в качестве разделителя строк и запятыми или пробелами в качестве разделителей столбцов в каждой строке:
Попробуйте онлайн!
объяснение
Работал пример
Рассмотрим вход
[1 2 3; 4 5 6]
. Цикл for начинается с"
каждого столбца ввода. В каждой итерации@
помещает текущий столбец в стек. Так что в первой итерации это толкает[1; 4]
.N$
указывает, что все содержимое стека будет использоваться в качестве входных данных для следующей функцииYd
.Эта функция (соответствующая MATLAB
blkdiag
) «объединяет по диагонали» свои входы, чтобы получить блочную диагональную матрицу (2D-массив). Таким образом, в первой итерацииYd
он принимает один вход и производит выход, равный этому входу[1; 4]
, который остается в стеке.Во второй итерации второй столбец ввода,
[2; 5]
вставляется. ТеперьYd
принимает два 2 × 1 входы, а именно[1; 4]
и[2; 5]
, и производит массив с 4 × 2[1 0; 4 0; 0 2; 0 5]
.На третьей итерации
Yd
берется последний массив 4 × 2 и третий столбец ввода[3; 6]
, и выдается окончательный результат[1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6]
.источник
ES6, 65 байт
Принимает в качестве входных данных и возвращает в качестве выходных данных массив массивов.
источник
Mathematica,
4039 байтКредит @Seeq для
Infix
ingFlatten
.Ввод - это список векторов строк, разделенных
{}
скобками. Таким образом, первоначальный пример представленСоздайте массив, в
DiagonalMatrix
котором каждый имеет диагональные элементы из строк ввода (трехмерный массив).Transpose
поэтомуFlatten
операция удаляет правильные пары скобок, чтобы получить желаемую матрицу (теперь двумерный массив).источник
DiagonalMatrix/@#
сработает? И, как следствие,Transpose[DiagonalMatrix/@#]~Flatten~1&
Infix
Flatten
хотя. +1.Пиф, 17
Попробуйте онлайн или запустите Test Suite .
Вы можете добавить ведущий,
j
чтобы помочь визуализировать 2D-массив.источник
Желе, 13 байт
Попробуйте онлайн!
Как это устроено
источник
Mathematica, 111 байт
источник
Table
иPart
ошибки при использовании стандартных ММЫ матричных обозначений и результатов в массиве смешанных размеров.Рубин,
81787662 байтавздох Вручную отслеживание индекса короче, чем
with_index
.источник
R, 41 байт
Предполагается
pryr
,Matrix
иplyr
пакеты установлены.Это создает функцию, которая принимает 2D-массив (a) и возвращает «sparseMatrix», где (где 0 представлены как
.
)Объяснение:
plyr::alply(a,2)
каждый столбецa
и возвращает объединяет эти результаты в списокMatrix::.bdiag(lst)
создает диагональную матрицу блока из списка матрицpryr::f
это сокращенный способ создания функции.Полностью базовое
R
решение в 59 байт (используя логику ответа Matlab @ PieCot):источник
MATLAB,
6968 байтОдин байт сбрили: спасибо Луису Мендо :)
источник
APL (Dyalog Classic) , 11 байт
Попробуйте онлайн!
источник