Абелева кучей песок , для наших целей, является бесконечной сеткой с целыми координатами, сначала опорожнить песок. Через каждую секунду песчинка помещается в (0,0). Всякий раз, когда ячейка сетки имеет 4 или более песчинок, она разливает по одной песчинке каждому из своих четырех соседей одновременно. Соседями (x, y) являются (x-1, y), (x + 1, y), (x, y-1) и (x, y + 1).
Когда клетка разливается, это может привести к разливу ее соседей. Несколько фактов:
- Этот каскад в конечном итоге остановится.
- Порядок разлива клеток не имеет значения; результат будет таким же.
пример
Через 3 секунды сетка выглядит
.....
.....
..3..
.....
.....
Через 4 секунды:
.....
..1..
.1.1.
..1..
.....
Через 15 секунд:
.....
..3..
.333.
..3..
.....
И через 16 секунд:
..1..
.212.
11.11
.212.
..1..
Соревнование
Как можно меньше байтов, напишите функцию, которая принимает одно положительное целое число t и выводит изображение песочной кучи через t секунд.
вход
Одно положительное целое число t в любом формате, который вы выберете.
Выход
Изображение песочницы через t секунд, используя символы
. 1 2 3
Редактировать: Используйте любые четыре различных символа, которые вам нравятся, или нарисуйте картинку. Если вы не используете «.123» или «0123», укажите в своем ответе, что обозначают символы.
В отличие от примеров, ваш вывод должен содержать минимальное количество строк и столбцов, необходимое для отображения ненулевой части песочницы.
То есть для входа 3 вывод должен быть
3
Для 4 выход должен быть
.1.
1.1
.1.
счет
Применяется стандартная оценка игры в гольф.
правила
Никакие языковые функции или библиотеки, которые уже знают, что такое песочница, не допускаются.
Редактировать: раздел вывода был отредактирован, ограничение набора символов было полностью снято. Используйте любые четыре различных символа или цвета, которые вам нравятся.
источник
0
? Каков выход?.
для пустых ячеек? Можем ли мы иметь0
в качестве действительной пустой ячейки?Ответы:
R
378343297291 байтКак обычно, пользователь вводит свои данные через
scan()
(я уже использовал переменнуюt
, так что давайте возьмемz
вместо этого), поэтому вторая строка должна быть запущена отдельно, а затем остальные:Выводит массив, содержащий значения
a
at-t
го поколения (0, 1, 2 или 3).Тестовые случаи:
Нам помогает то, что эта вещь симметрична как по вертикали, так и по горизонтали, что означает, что самая левая точка получает высоту 4, это означает, что самые верхние, самые правые и самые низкие точки также равны 4.
О, и я говорил, что вы можете делать красивые визуализации?
После 1000 капель:
После 50000 падений (≈4 секунды):
После 333333 капель (≈15 минут):
Вы тоже можете это нарисовать!
Это заняло 4 секунды на 10000 итераций, но значительно замедляется при больших размерах массива (например, пару минут на 100000 итераций). Вот почему он становится таким медленным (я оценил скорость роста, как в и получил τ (i) ≈689 · i ^ 1.08, поэтому среднее время на одно дополнительное зерно, пока вся песочная куча не оседает после
i
шага, немного больше единицы) и общее время как функция числа зерен растет немного медленнее, чем квадратично (T (i) ≈0,028 * i ^ 1,74):А теперь с полным объяснением:
Это первый раз в моей жизни, когда растущие объекты (например
a <- c(a, 1)
) работают намного быстрее, чем предварительно выделяя большую пустую матрицу для значений и постепенно заполняя ее тонной неиспользованных нулей.Обновить. Golfed 18 байт путем удаления
arr.ind
вwhich
силу Billywob и заменыrep(0,n)
сe=numeric;e(n)
в 5 случаях из - за JDL , а еще 17 байт за счет JDL .Обновление 2. Поскольку песочница абелева, она может начинаться со стека желаемой высоты, поэтому я удалил лишнюю петлю и получил огромное повышение производительности!
источник
rep()
, учитывая, что вы используете его 6 раз. Во-вторых, я не думаю, что вам нужно выписыватьarr.ind=T
опцию дляwhich()
функции. Просто используйтеwhich(...,T)
.n=numeric
и использовать вместо этого, такn(k)
как символов меньше, чемr(0,k)
. Мне нравятся картинки, хотя.1%*%0
меньше символов, чемarray(0,c(1,1))
. Кроме того, вторым аргументомu <- cbind
может быть только 1,cbind
по умолчанию он будет расширен до длины первого аргумента.MATL ,
5553484342 байтаВдохновленный ответом @ flawr .
Графический вывод :
Попробуйте это в MATL Online! , Требуется около 10 секунд для ввода
30
. Возможно, вам придется обновить страницу и снова нажать «Выполнить», если она не работает.Вот пример результата для ввода
100
:Выход ASCII (43 байта) :
Попробуйте онлайн!
объяснение
источник
1Y6
.~mod(spiral(3),2)
намного умнее :-)Matlab,
160 156148 байтСначала создается слишком большая матрица, где-
n
то посередине. Затем вычисляется каскад с очень удобной двумерной сверткой. В конце лишнее обрезается, и все это превращается в строку.Пример вывода для
t=100
Как всегда:
источник
v=any(z)
вместоv=find(sum(z))
(я использую это в своем ответе). Также2*~z
вместо(z<1)*2
n=500
... Он работал вn=400
течение нескольких секунд. Я делаю что-то неправильно?n
этой программы генерируется3*n x 3*n
матрица, поэтому в ней необходимо хранить около9*n^2
цифр. Также это абсолютно неэффективно, потому что у нас также есть совершенно ненужная длинная итерация от 1 до n. Но опять же, это код-гольф , а эффективная программа - это другая чашка чая.z=sparse(zeros(2*n+1))
и изменив цикл for наwhile any(z(:)>3)
. Тогда вы можете также возможно вычислить ядро свертки только один раз:kern = 1-mod(spiral(3),2)
.Python 2,
195 +1 +24 = 220217выход для n = 16
есть много ненужных дополнений и итераций, используя
n
в качестве «достаточно хорошей» верхней границы, но n = 200 все еще завершается в секунду и n = 500 в течение 12 секундungolfed
замена
return x
наimshow(x)
добавляет один символ и выводит уродливое интерполированное изображение, добавлениеimshow(x,'gray',None,1,'nearest')
удаляет размытую интерполяцию, доводя вывод до спецификацийисточник
ImportError: No module named convolve2d
. Изменение,import scipy.signal.convolve2d as c
чтобыfrom scipy.signal import convolve2d as c
решить проблему. Я использую версию scipy 0.16.1, мне нужна старая или более новая версия? Или проблема в другом?Perl,
157147 байтВключает +1 для
-p
Запустить с подсчетом на STDIN, распечатать карту, используя
0123
STDOUT:sandpile.pl
:источник
Python
32,418385362342330 байтРедактировать: сохранено 6 байт благодаря @ Qwerp-Derp
Вся заслуга @ Andreï Kostyrka, так как это прямой перевод его кода R на Python.
источник
a,x,r
в аргументы функции.JavaScript,
418416406400393 байтаСоздает анонимную функцию, которая отображает вывод на консоли.
источник
Ним, 294 персонажа
Скомпилируйте и запустите:
Примечания:
x
она рассчитывается как число нулевых столбцов в начале среднего ряда.x
строк и столбцов с каждого конца.Представление
источник
Scala, 274 байта
Использование:
scala sandpile.scala <iterations>
Я не думаю, что есть много, чтобы объяснить об этом. В основном это просто добавляет одну песчинку к центру. Затем проверяет, больше ли оно 4, если так, то оно будет перетекать и проверять всех соседей больше 4, перетекать и т. Д. Это довольно быстро.
Представление:
источник
J, 76 байт
Я определяю глагол,
p
который дополняет границу нулей вокруг ввода. Основной глагол принимает массив в качестве входных данных. Затем он проверяет первый ряд на наличие песочницы, которая содержит 4 или более зерна. Если это так, он выводит тот же массив за исключением заполненияp
, а в противном случае он выполняет 2-мерную свертку для имитации падающих зерен. Основной глагол повторяется до сходимости с использованием степенного оператора^:_
.использование
Для вычисления результата при n = 50000 требуется около 46 секунд , и результат может быть отображен с помощью
viewmat
аддона с монохромной цветовой схемой.источник
С 229 (с большим количеством предупреждений)
источник
APL (Dyalog Unicode) , 51 байт SBCS
Попробуйте онлайн!
источник
PHP, 213 байт
рекурсивно создает кучу
$p
, помня размер в$m
; затем печатает с вложенными циклами.Беги с
-r
.источник