(Есть связанные вопросы о бесконечных песчаных кучах и поиске элементов идентичности песочных куч .)
Если задана матрица неотрицательных целых чисел, верните матрицу тех же размеров, но свергнутую :
- Если матрица не содержит значений больше 4, верните ее.
- Каждая «ячейка», которая больше 3, уменьшается на 4, и все непосредственно соседние ячейки (сверху, снизу, слева и справа) увеличиваются, если они существуют.
- GOTO 1.
Примеры:
0 1 0 0 2 0
2 4 0 -> 3 0 1
0 0 3 0 1 3
1 2 3 2 3 4 2 5 1 4 1 2 0 3 3 0 3 3 0 3 3
4 5 6 -> 2 4 4 -> 4 2 3 -> 0 5 4 -> 3 2 1 -> 3 3 1 -> 3 3 2
7 8 9 5 7 7 2 6 5 4 3 2 0 5 3 1 1 4 1 2 0
(Вам нужно только вернуть конечный результат. Путь, по которому вы его достигнете, может отличаться от показанного здесь: не имеет значения, в каком порядке вы выполняете операции свертывания, все они приводят к одному и тому же результату.)
Более подробное объяснение и некоторую мотивацию см. В этом видео Numberphile или в статье в Википедии об абелевой модели песочных куч .
Правила:
- Вы можете взять ввод и вывод любым из стандартных способов
- Лазейки запрещены
- Вход и выход могут быть:
- вложенный список:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- простой список:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
и форма - какой-то родной тип матрицы
- строка, например
1 2 3\n4 5 6\n7 8 9
- или что еще работает на вашем языке.
- вложенный список:
- Вход и выход должны быть в одинаковой форме
- Входные данные могут содержать большие числа, чем показанные здесь, но размер может быть ограничен пределами вашего языка (эквиваленты MAXINT, если применимо)
- Матрица может иметь любую форму (например, 1x1, 2x2, 3x3, 4x4, 2x7, 11x3, ...)
- Вам не нужно обрабатывать случай, когда форма 0xN или Nx0.
Testcases
[[2, 5, 4], [8, 6, 4], [1, 2, 3]] -> [[3, 3, 0], [1, 2, 2], [1, 3, 2]]
[[0, 0, 2], [1, 3, 3], [0, 0, 0]] -> [[0, 0, 2], [1, 3, 3], [0, 0, 0]]
[[9, 9, 9], [9, 9, 9], [9, 9, 9]] -> [[1, 3, 1], [3, 1, 3], [1, 3, 1]]
[[4, 5], [2, 3]] -> [[2, 3], [0, 1]]
[[2, 3, 5], [2, 2, 0]] -> [[3, 0, 2], [2, 3, 1]]
[[7]] -> [[3]]
Это Codegolf , самый короткий код (на язык) выигрывает.
code-golf
array-manipulation
cellular-automata
L3viathan
источник
источник
Ответы:
MATL , 17 байт
Попробуйте это в MATL Online! Или проверьте все тестовые случаи .
объяснение
Программа повторяется столько раз, сколько сумма ввода. Это свободная верхняя граница необходимого количества итераций.
Для каждой итерации
3
обнаруживаются записи в превышении матрицы песочницы , дающей матрицу1
и0
, которая свернута с маской с 4 соседями. Записи, превышающие3
в матрице песочницы, уменьшаются на4
, и результат свертки добавляется.Для последних итераций, в которых матрица песочницы не имеет превышающих чисел чисел
3
, из нее вычитаются нули и добавляются к ней, поэтому это не затрагивается.источник
Mathematica, 65 байт
объяснение
Повторно преобразуйте входные данные, свергнув все кучи, превышающие 3. Этот процесс останавливается автоматически, когда преобразование не может изменить матрицу (т. Е. Когда больше нет больших кучи). В следующем выражении матрица называется
s
.Создайте матрицу, которая имеет
1
всякий раз, когда текущая матрица имеет4
или больше, и ноль в противном случае. По сути, это маска, которая указывает, какие сваи нужно свергнуть. Назови маскуx
.Сначала мы вычисляем количество песка, которое добавляется в каждую кучу из-за свалившихся соседних куч. Это делается с помощью свертки следующей матрицы над
x
:По сути, он добавляет один к текущей ячейке для каждого из своих соседей фон Неймана в маске.
Мы добавляем предыдущий результат
s
и затем четыре раза вычитаем из него маску, чтобы уменьшить количество свернутых свай.источник
Октава, 65 байт
Это не очень хорошо, я, должно быть, упускаю некоторые уловки ...
источник
input(0)
?>> version ans = 4.0.1
JavaScript (ES6),
10195 байтПринимает ширину матрицы
w
и массив значенийa
в синтаксисе карри(w)(a)
. Возвращает массив значений.Отформатировано и прокомментировано
Контрольные примеры
Показать фрагмент кода
источник
JavaScript (ES6),
118114104 байтаСохранено 2 байта благодаря @Neil
источник
(i-=x)|y-j?i*i+
?a.find(...b.find(...c>3&&a.map(...)))&&f(a)
..map
не мутирует ...f=a=>a.find((b,x)=>b.find((c,y)=>c>3&&a.map(b=>b.map((_,j)=>b[j]+=x|(j-=y)?x*x+j*j==1:-4)&x--)))&&f(a)
C ++,
261258250 байтовПринимает ввод как ссылку на вектор векторов и изменяет его напрямую.
Попробуйте онлайн!
источник