Сжать разреженную матрицу, используя сжатый разреженный ряд (формат CSR, CRS или Yale) .
Это все одинаковые формы сжатия (игнорируйте новый Yale).
Входными данными может быть любая двумерная структура данных (список списков и т. Д.): Например,
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
И выходные данные должны быть тремя 1d структурами данных (список и т. Д.), Которые обозначают выходные данные A
, IA
и JA
, например,
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
Процесс описан википедией:
Массив A имеет длину NNZ и содержит все ненулевые элементы M в порядке слева направо сверху вниз («строка-майор»).
Массив IA имеет длину m + 1. Он определяется этим рекурсивным определением:
IA [0] = 0 IA [i] = IA [i - 1] + (количество ненулевых элементов в (i - 1) -й строке в исходной матрице)
Таким образом, первые m элементов IA хранят индекс в A первого ненулевого элемента в каждой строке M, а последний элемент IA [m] хранит NNZ, количество элементов в A, которое также можно рассматривать как индекс в A первого элемента фантомной строки сразу за концом матрицы M. Значения i-й строки исходной матрицы считываются из элементов A [IA [i]] в A [IA [i +] 1] - 1] (включительно с обоих концов), то есть от начала одной строки до последнего индекса непосредственно перед началом следующей. [5]
Третий массив, JA, содержит индекс столбца в M каждого элемента A и, следовательно, также имеет длину NNZ.
Если ваш язык не поддерживает фактические структуры данных, ввод и вывод могут быть текстовыми.
Контрольные примеры
Вход 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Выход 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Вход 2
[[10 20 0 0 0 0],
[0 30 0 40 0 0],
[0 0 50 60 70 0],
[0 0 0 0 0 80]]
Выход 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Вход 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Выход 3:
[ ]
[ 0 0 0 0 ]
[ ]
Вход 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Выход 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Вход 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Выход 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Предположим, что входные данные могут содержать любое действительное число, вам не нужно учитывать математические символы или экспоненциальное представление (например, 5000 никогда не будет введено как 5e3). Вам не нужно обрабатывать inf
, -inf
, NaN
или любые другие «псевдо-номера». Вы можете вывести другое представление числа (5000 может быть представлен в виде 5E3 , если вы этого хотите).
Подсчет очков:
Это код-гольф , побеждает меньше байтов.
Leaderboards
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
IA[0] = 0
совершенно ненужным? Нужно только определить IA[i] = IA[i − 1]...
, но мы могли бы просто заявить, что если i-1 < 0
использовать 0. То есть, IA [0] всегда равно 0, поэтому его можно сжать (да, я понимаю, что это критика алгоритма, не этот вызов).