Сжать разреженную матрицу, используя сжатый разреженный ряд (формат 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, поэтому его можно сжать (да, я понимаю, что это критика алгоритма, не этот вызов).Ответы:
MATL , 19 байт
Ввод используется в
;
качестве разделителя строк.Попробуйте онлайн! Или проверьте все тестовые случаи: 1 , 2 , 3 , 4 , 5 .
объяснение
источник
Mathematica, 78 байт
Смотрите этот ответ на mathematica.stackexchange.com .
источник
Haskell, 87 байт
Попробуйте онлайн!
Как это устроено:
источник
Желе , 24 байта
Попробуйте онлайн!
источник
APL (Dyalog) ,
3128 символов или3633 байта *Требуется
⎕IO←0
для индексации с нуля. I / O - это список списков.Попробуйте онлайн!
{
…}
Анонимная функция, в которой аргумент представлен ⍵(
...)(
...)(
...)
вернуть список из трех вещей:⍵≠0
Логическое где аргумент отличается от 0⍸¨
ɩ ndices тех , для каждого суб-списка∊
е NLIST (сплющить) объединить в один список⍵~¨0
удалить нули из каждого суб-лист аргументаd←
магазина , который , как д≢¨
бирки каждой+\
совокупная суммы0,
Prepend ноля∊d
ε NLIST (Flatten) d объединить в один список* Чтобы запустить в Dyalog Classic, просто замените
⍸
на⎕U2378
.источник
f 4 4⍴
а потом значения?f
. Входное действительно РЕПЛИ, который требуетf
от результата ,4 4⍴…
который г eshapes данных в матрицу 4 × 4.PHP , 107 байт
Попробуйте онлайн!
PHP , 109 байт
Попробуйте онлайн!
источник
$x[]=$v
на$x[]=+$v
JavaScript (ES6), 117 байт
Ввод - это двумерный массив чисел, а вывод - массив
[A, IA, JA]
.Разъяснения
тесты
Показать фрагмент кода
источник
Python 2 , 115 байт
Попробуйте онлайн!
Выход
[A, JA, IA]
источник
Perl 6 , 84 байта
Попробуйте онлайн!
Единственный матричный аргумент находится в
$_
..flatmap(*.grep(+*))
выбирает ненулевые элементы всей матрицы.[\+] .map(+*.grep(+*))
это треугольное сокращение числа элементов в каждой строке (которое некоторые языки называютscan
).(0,|...)
добавляет ноль к этому списку..flat.kv
создает индексированный список всех элементов матрицы..flatmap: { $^a % .[0] xx ?$^b }
плоские карты по модулю каждого индекса по количеству столбцов в массиве (.[0]
количество элементов в первой строке), реплицированные самим элементом, интерпретируются как логическое значение. Таким образом, ненулевые элементы реплицируются один раз, а нулевые элементы реплицируются ноль раз (то есть удаляются).источник
Python + SciPy, 79 байт
я думаю встроенные модули не были запрещены
Принимает ввод в формате
[[0, 0, 0, 0],[5, 8, 0, 0],[0, 0, 3, 0],[0, 6, 0, 0]]
источник
Джапт ,
3127 байтПринимает ввод как массив массивов и возвращает массив массивов.
Протестируйте это (
-Q
пометьте только для визуализации)объяснение
Неявный ввод массива
U
.[[1,1,1],[1,1,1],[1,1,1]]
Для первого sub = -array мы сглаживаем (
c
),U
а затем фильтруем (f
) его, удаляя любые элементы Falsey (т. Е. 0s)[1,1,1,1,1,1,1,1,1]
Мы собираемся создать другие 2 подмассива одновременно, сопоставляя их
U
.Мы отображаем каждый элемент (под-массив) в
U
X
является текущим элементом текущего подмассива и©
является логическим AND (&&
), поэтому, еслиX
не верно (не ноль), следующая часть не будет выполнена.В Japt
N
это массив, содержащий все входные данные, поэтому здесь, еслиX
это правда, мы помещаем (p
) индекс (Y
) текущего элемента вN
.[[[1,1,1],[1,1,1],[1,1,1]],0,1,2,0,1,2,0,1,2]
Вернемся к карте основного массива, и для каждого элемента (
Z
) мы получим количество элементов в этом подмассиве, которые являются истинными (не нулевыми).[3,3,3]
Кумулятивно уменьшить этот массив путем суммирования.
[3,6,9]
Вставьте (
i
) 0 в индекс 0, чтобы завершить второй под-массив.[0,3,6,9]
Для окончательного подмассива мы просто отрезаем
N
от 1-го элемента.[0,1,2,0,1,2,0,1,2]
источник