Стисніть розріджену матрицю за допомогою стисненого розрідженого рядка (формат CSR, CRS або Yale) .
Це все ті ж форми стиснення (ігноруйте новий Єльський).
Вхідним може бути будь-яка 2d структура даних (список списків тощо): напр
[[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,]
Процес описаний у wikipedia:
Масив A має довжину NNZ і містить усі ненульові записи M у порядку "зліва направо зверху вниз" (рядок-мажор ").
ІА масиву має довжину 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
або будь-які інші «псевдо-номера». Ви можете вивести інше представлення числа (5,000 може бути виведено як 5e3, якщо ви захочете).
Оцінка:
Це кодовий гольф , виграє найменше байтів.
Табло лідерів
Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.
Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:
# 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, для цього його можна стиснути (так, я розумію, що це критика алгоритму, не цей виклик).