Давайте определим матрицу из 9 с:
Давайте определим взрывающееся число как число в позиции которое можно разложить на равные целые числа между всеми соседними соседями (включая себя), и абсолютное значение каждой части больше 0.
Из предыдущей матрицы давайте разберем число в позиции (0 проиндексировано)
N = \ begin { bmatrix} 9+ \ color {red} 1 & 9 + \ color {red} 1 & 9 + \ color {red} 1 \\ 9+ \ color {red} 1 & \ color {blue} 0+ \ color {red} 1 & 9 + \ color {red} 1 \\ 9+ \ color {red} 1 & 9 + \ color {red} 1 & 9 + \ color {red} 1 \ end {bmatrix}
Иногда разложение приводит к рациональному числу, большему, чем 1. Это то, что нам нужно избегать при разложении чисел. В этом случае остаток будет присваиваться разнесенному номеру.
Чтобы продемонстрировать это, давайте продолжим работать с нашей предыдущей матрицей. На этот раз мы взорвем число в позиции
Здесь у нас есть 3 соседей и сам номер. Здесь уравнение примерно которое дает нам 2 для каждого и 2 для остатка.
Кроме того, иногда число не может быть достаточно большим, чтобы его можно было разложить на равные части (где abs больше 0) между его соседями (| рациональное число | <1). В этом случае нам нужно «позаимствовать» из разнесенного числа, чтобы сохранить условие «больше 0» . Давайте продолжим с нашим предыдущим примером и взорвем число в позиции .
Задача состоит в том, чтобы, учитывая список позиций и конечный непустой массив натуральных чисел, вернуть разобранную форму после того, как каждое число из списка позиций было взорвано.
Контрольные примеры
Входные данные: initial matrix: [[3, 3, 3], [3, 3, 3], [3, 3, 3]], numbers: [[0,0],[0,1],[0,2]]
Выход: [[1, 0, 1], [5, 6, 5], [3, 3, 3]]
Входные данные: Initial matrix: [[9, 8, 7], [8, 9, 7], [8, 7, 9]], numbers: [[0,0],[1,1],[2,2]]
Выход: [[4, 11, 8],[11, 5, 10],[9, 10, 4]]
Входные данные: Initial matrix: [[0, 0], [0, 0]], numbers: [[0,0],[0,0],[0,0]]
Выход: [[-9, 3],[3, 3]]
Входные данные: Initial Matrix: [[10, 20, 30],[30, 20, 10],[40, 50, 60]], numbers: [[0,2],[2,0],[1,1],[1,0]]
Выход: [[21, 38, 13], [9, 12, 21], [21, 71, 64]]
Входные данные: Initial Matrix: [[1]], numbers: [[0,0]]
Выход: [[1]]
Входные данные: Initial Matrix: [[1, 2, 3]], numbers: [[0,0], [0, 1]]
Выход: [[1, 1, 4]]
Заметки
Применяются правила ввода / вывода
Вы можете предположить, что входная матрица никогда не будет пустой
Вы можете предположить, что координаты всегда будут действительными
Координаты ввода в тестовых случаях задаются как (строка, столбец). Если вам нужно, чтобы это было (x, y), вы можете поменять местами значения. Если да, пожалуйста, укажите это в своем ответе
Ответы:
C (GCC)
220216214212 байткредит @ceilingcat на 2 байта
Запустите это здесь
чуть менее гольф-версия
Код вызова с примером
и выход
источник
JavaScript (ES7),
126 125 123121 байтСохранено 2 байта благодаря @Shaggy
Принимает вход как
(matrix)(list)
. Выходы путем изменения матрицы.Попробуйте онлайн!
Как?
Вместо этого мы используем рекурсивную функцию, которая выполняет более простой поток операций, повторяемый столько раз, сколько необходимо:
Основным преимуществом является то, что нам нужен только один цикл по матрице. Второе преимущество заключается в том, что нам вообще не нужно вычислять частное.
пример
После шага 1 на первой итерации , мы имеем:
И после шага 2 на первой итерации :
После шага 1 на второй итерации , мы имеем:
И после шага 2 на второй итерации :
Теперь мы увеличиваем ссылочную ячейку дважды ( шаг 4 из обеих итераций ), что приводит к конечному результату:
комментарии
источник
(0)
двумя обратными галочками.R ,
163162161159155146 байтПопробуйте онлайн!
объяснение
(Соответствует предыдущей версии кода)
источник
Чисто ,
181167 байтПопробуйте онлайн!
В виде частично-прикладной буквальной функции.
Расширено (первая версия):
источник
Ржавчина - 295 байт
Это довольно долго из-за того, что Rust требует индексирования целых чисел без знака, но требует, чтобы целые числа со знаками делали вычитание, что приводит к отрицательным значениям. Однако я считаю, что мой алгоритм является «самым коротким алгоритмом» до сих пор. На самом деле нет необходимости иметь дело с обнаружением краев, дна и т. Д.
Обратите внимание на три вещи: во-первых, сумма всех ячеек всегда постоянна. Во-вторых, это ситуация деления / остатка, поэтому мы можем применить мышление в стиле алгоритма Брезенхема. В-третьих, вопрос всегда добавляет одно и то же число ко всем ячейкам на определенном расстоянии от ячейки специальной позиции, прежде чем иметь дело с «лишними» вещами в специальной позиции.
Алгоритм:
Сохранить исходное значение ячейки в позиции P в M.
Начать цикл:
Итерация по каждой ячейке I в матрице. Если положение ячейки I находится в пределах 3 квадрантов (квадратное расстояние) от положения P, то вычтите 1 из ячейки P и добавьте 1 к ячейке I. Посчитайте, сколько раз это делается за одну итерацию матрицы.
Если значение, оставшееся в ячейке в позиции P, меньше или равно M / Count + M по модулю Count, то прервите цикл. В противном случае выполните цикл снова.
Полученная матрица будет разобранной версией. Счет - это в основном способ сосчитать соседей, не имея дело с ребрами. Циклы - это способ разбить вещи деления / сложения на повторяющееся одиночное сложение / вычитание одного. Проверка по модулю гарантирует, что у нас останется соответствующий остаток в позиции P, чтобы справиться со «взрывами», которые не делятся поровну между соседями. Структура цикла do / while позволяет P <0 работать правильно.
Безголовая версия на Rust Playground
источник
f
было бы. Но вы могли бы, вероятно, сохранить еще больше байтов, используя анонимную функцию:|p:(i8,i8),v:&mut Vec<Vec<i8>>|{...}
Ява 10,
194193191190184182171 байтИтеративный порт ответа @Arnauld на JavaScript .
-17 байт благодаря @Arnauld .
Изменяет матрицу ввода вместо возврата новой, чтобы сохранить байты.
Попробуйте онлайн.
Объяснение:
источник
m[y]
m[y][x]
undefined[x]
получится. В любом случае, ваш(x-X)**2+(y-Y)**2<3
чек довольно умен. Необходимо помнить, что когда я хочу проверить значения в матрице в блоке 3х3 (и в определенных пределах) вокруг него. Я думаю, что на самом деле у меня есть несколько таких ответов, где я сейчас использую try-catch, а в одном случае - try-finally ... Посмотрим на них, когда у меня будет время.Common Lisp , 498 байт
Попробуйте онлайн!
Используйте эту функцию как
(print (c #2A((3 3 3) (3 3 3) (3 3 3)) '((0 0)(0 1)(0 2))))
Лучше читаемая версия:
Пример вывода:
источник
Python 2 , 171 байт
Попробуйте онлайн!
источник