Схемы Зоны активности
Рассмотрим прямоугольную комнату, на потолке которой у нас есть тепловизионная камера, направленная вниз. В комнате есть несколько источников тепла интенсивности 1-9
, фоновая температура 0
. Тепло рассеивается от каждого источника, падая на одну единицу за (недиагональный) шаг. Например, 20x10
комната
...........1........
....................
...8................
..5...............2.
....................
.1..................
................1...
.................65.
....................
............2.......
содержит 9 источников тепла, и температурный градиент, показанный тепловой камерой
34565432100100000000
45676543210000000000
56787654321000000110
45676543210000001221
34565432100000012321
23454321000000123432
12343210000001234543
01232100000012345654
00121000000011234543
00010000000121123432
В графической форме это может выглядеть так:
Из градиента мы можем определить положение и интенсивность некоторых источников тепла, но не всех. Например, все 9
s всегда могут быть выведены, так как они имеют максимальную температуру, как и 8
в этом случае, так как это создает локальный максимум в градиенте. 2
Вблизи правая граница также может быть выведено, даже если он не находится на локальном максимуме, так как он не имеет другого , 2
как соседа. В 5
s, с другой стороны, не выводится, так как их тепло может также быть получены путем более интенсивных источников вблизи них. В 0
s известен не содержит никаких источников тепла, но и все остальные плитки могут потенциально содержать один. Давайте обозначим неопределенные плитки дефисами-
, определенные источники тепла по соответствующим цифрам и определенное пустое пространство по периодам .
:
---------..1........
----------..........
---8-------......--.
----------......--2-
---------......-----
--------......------
-------......-------
.-----......-----6--
..---.......--------
...-.......-2-------
Ваша задача должна состоять в том, чтобы получить эту выведенную картину из температурного градиента.
правила
Вам предоставляется ввод в виде строки, разделенной либо новыми строками, либо вертикальными трубами |
, в зависимости от того, что удобнее, и выходные данные должны иметь ту же форму. На входе и / или выходе может быть конечный разделитель, но не предшествующий. Размер ввода может варьироваться, но его ширина и высота всегда как минимум 4
. Обе функции и полные программы являются приемлемыми. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Дополнительные тестовые случаи
Входные данные:
898778765432100
787667654321100
677656543211210
678765432112321
567654321123210
который выглядит так в графической форме:
Выход:
-9---8-------..
-------------..
--------------.
--8---------3--
-----------3--.
Входные данные:
7898
8787
7676
6565
Выход:
--9-
8---
----
----
Входные данные:
00001
00000
00000
10000
Выход:
....1
.....
.....
1....
Ответы:
CJam,
73 69 6255 байтовОБНОВЛЕНИЕ : Новый алгоритм. Короче и больше возможностей для улучшения
Как это работает
Логика похожа на алгоритм ниже, но здесь я не проверяю всех 4 соседей за одну итерацию. Вместо этого я использую меньший подход, чтобы перебрать все строки и столбцы в обоих направлениях. Вот эти шаги:
.
либо-
.Вот пример запуска на небольшом входе:
После первого шага:
После второго шага:
После последнего сопоставления с одним символом, окончательный вывод:
Объяснение кода :
Попробуй здесь
Старый подход
Как это работает
Логика проста, итерация по сетке и посмотреть, больше или равно текущее значение для остальных четырех соседей - вверх, вниз, влево и вправо. Затем преобразуйте текущее значение на основе приведенного выше правила и, если оно равно 0, сделайте его "." ,
Код Объяснение
Попробуйте онлайн здесь
источник
JavaScript (ES6) 99
Тест в консоли Firefox / FireBug
Выход
источник
Python 2: 154 байта
Ввод должен быть в форме
"00001\n00000\n00000\n10000"
.Преобразование строки в 2D-матрицу довольно долго в Python. Поэтому я сохраняю оригинальный формат строки. Я перечисляю по входу,
i
это индекс,v
это символ (наконец, перечислить сохраненные байты в решении для гольфа!). Для каждой пары(i,v)
я вычисляю правильный символ вывода и присоединяюсь к ним. Как выбрать правильный выходной символ? Еслиv == '\n'
выходной символ есть\n
, тоv == '0'
выходной символ есть'.'
. В противном случае я проверяю 4 соседаv
, которыеb[i-b.index('\n')-1]
(выше),b[i-1]
(слева,b[i+1]
(справа) иb[i+b.index('\n')+1]
(ниже), если они есть,<= v
и выбираю символ'-'
илиv
, Здесь я сравниваю символы, а не числа, но это работает вполне нормально, потому что значения ascii находятся в правильном порядке. Также нет проблем, еслиb[i-1]
илиb[i+1]
равных'\n'
, потому чтоord('\n') = 10
.Pyth:
6158Более или менее перевод скрипта Python. Довольно некрасиво ;-)
Попробуйте онлайн: Pyth Compiler / Executor Тот же формат ввода, что и в решении Python.
источник
Perl,
77, 75, 7270Стандартные 2d трюки с регулярным выражением.
Пример:
Попробуй здесь
источник
Ява,
307,304,303,299298Это, безусловно, «идеальный» вызов для некоторого Java-программиста :)
Вход (метод «|»):
Выход:
источник
char[]r=a[0].replace("|", <--here"").toCharArray()
.APL, 92
Пример:
источник
Рубин 140
Ничего особенного; просто переберите карту и сравните текущее значение со значением четырех соседей.
Запустите его онлайн с тестами: http://ideone.com/AQkOSY
источник
R 223
О лучшем, что я могу придумать на данный момент. Работа со строкой довольно дорогая. Я думаю, что есть возможности для улучшения, но пока не вижу
Результат испытаний
источник
J - 69 байт
Примеры:
PS:
(0 : 0)
это стандартный J способ указания строк. Вы также можете использовать|
строки с разделителями (с завершающим|
).источник
Excel VBA - 426
Это будет редким случаем, когда VBA выигрывает любые игры в гольф с кодом, но так как это то, чем я больше всего пользуюсь, с этим интересно играть. Первая строка - это крайний случай, который сделал это длиннее, чем должно быть.
Количество не включает начальные пробелы.
Я поиграл с идеей отправки ввода на лист и работы оттуда, но я думаю, что зацикливание передаваемой строки посимвольно сохраняет код.
Звонок из непосредственного окна:
Вывод (в окне):
источник
Perl - 226
Вы можете попробовать это на Ideone . Если кто-то заинтересован в объяснении, дайте мне знать.
источник
Хаскелл - 193
f
это функция, которая принимает строку в форме0001\n0000\n0000\n1000
и возвращает требуемую строку.g
это функция, которая принимает список списков символов и возвращает список списков ((влево, вверх), this, (вправо, вниз)).источник