Я большой поклонник игры Creeper World, и особенно сиквела. Вам не нужно знать, как эта игра работает, чтобы ответить на вопрос, я просто хотел упомянуть, откуда возник мой вопрос.
В игре ваша цель - уничтожить Эмиттеры, которые порождают Крипера, используя оружие, известное как нулификатор.
Нулификаторы могут уничтожить любой излучатель в этом радиусе:
eee
eeeee
eenee
eeeee
eee
Каждый нулификатор МОЖЕТ предназначаться для нескольких Излучателей.
Ваша цель
Учитывая массив, имитирующий 2D-карту, состоящую из ничего и излучателей с любыми символами, которые вам нравятся, это могут быть пробелы и e или числа - просто убедитесь, что они различимы, выведите одну и ту же карту с оптимальным количеством нулей n (или того, что вы хотите ), чтобы излучатели были уничтожены с наименьшим количеством нулей.
Если есть несколько оптимальных способов сделать это, просто вывести один будет хорошо. Однако, если задача не решаема, скажем, существует так много эмиттеров, что ни один макет никогда не ударит по всем из них, вы должны вывести что-то значительно отличающееся, нуля будет достаточно
Быстрые правила:
- Ввод: многомерный массив
- Входные данные будут содержать два символа, ничего не значащих и эмиттер , включая то, что есть что в вашем ответе
- Вывод: многомерный массив
- Вывод будет содержать три символа, ничего не значащих , эмиттер и обнуляющий ИЛИ различимый вывод, если ввод неразрешимый
- Вы можете заменить символ « ничто» только нулем
- Nullifier может поразить многократные излучатели, и всегда будет поражать все, что в диапазоне
- Нулификатор может попасть в область, указанную выше, и всегда будет поражать все излучатели, на которые он может нацелиться
- Самые короткие ответы в байтах выигрывают
- стандартные лазейки запрещены
Примеры
Входные данные:
[[ , ,e, , ],
[ , , , , ],
[e, , , ,e],
[ , , , , ],
[ , ,e, , ]]
Выход:
[[ , ,e, , ],
[ , , , , ],
[e, ,n, ,e],
[ , , , , ],
[ , ,e, , ]]
Входные данные:
[[e,e,e,e,e],
[e, , , ,e],
[e, , , ,e],
[e, , , ,e],
[e,e,e,e,e]]
Выход:
[[e,e,e,e,e],
[e, ,n, ,e],
[e, , , ,e],
[e, ,n, ,e],
[e,e,e,e,e]]
Входные данные:
[[e, , , , , , ,e, ,e, , , ,e, ,e, ,e, ,e],
[ , ,e, , ,e, , , ,e,e, , , , ,e, , , , ],
[ , ,e, , , ,e, ,e, ,e, ,e, ,e, ,e, , , ],
[e, , , ,e, ,e, , , , , , , , , , , ,e, ],
[e, , ,e, , , , , ,e, ,e, ,e, ,e, , , ,e],
[ , , ,e, ,e, ,e, , , , , , , , , ,e, , ],
[ ,e,e, ,e, , , ,e, ,e,e, ,e, ,e, ,e, , ],
[ , ,e, , , ,e, , , , , , , , ,e,e, ,e, ],
[ , , ,e, , , , ,e,e, , , , , , , , ,e, ],
[e, , , , , , ,e, , , ,e,e, ,e, , , , , ],
[ ,e,e, , ,e, , , , ,e, , , , , , ,e, , ],
[ , , ,e,e, ,e, ,e, , , ,e,e, ,e, ,e, ,e],
[e,e, , , , ,e, , , ,e, , , , , , , , , ],
[ , , ,e, , , , , ,e, , ,e, ,e, ,e, ,e, ],
[ , , , ,e, ,e, , , , , , , , , , , , , ],
[e,e, , ,e,e, , ,e, , ,e, ,e, ,e, ,e, ,e],
[e, ,e, ,e, , ,e,e,e, , ,e, , , ,e, , ,e],
[ , , , ,e, , , , , ,e, , , ,e, , , , , ],
[ , ,e, , , ,e, ,e, , , ,e, , , , ,e, , ],
[ , , ,e, ,e, ,e, , ,e,e, , ,e,e, , ,e, ]]
Вывод (Этот вывод сделан вручную и может не быть оптимальным выходом):
[[e, , , , , , ,e, ,e, , , ,e, ,e, ,e, ,e],
[ , ,e, , ,e, , ,n,e,e, , , ,n,e, , , , ],
[ ,n,e, , ,n,e, ,e, ,e, ,e, ,e, ,e, ,n, ],
[e, , , ,e, ,e, , , , , , , , , , , ,e, ],
[e, , ,e, , , , , ,e, ,e, ,e, ,e, , , ,e],
[ , ,n,e, ,e, ,e, , , ,n, , , , , ,e, , ],
[ ,e,e, ,e, ,n, ,e, ,e,e, ,e, ,e,n,e, , ],
[ , ,e, , , ,e, , , , , , , , ,e,e, ,e, ],
[ , , ,e, , , , ,e,e, , , , , , , , ,e, ],
[e, ,n, , , , ,e, , , ,e,e, ,e, , , , , ],
[ ,e,e, , ,e,n, , ,n,e, , , ,n, , ,e,e, ],
[ , , ,e,e, ,e, ,e, , , ,e,e, ,e, ,e, ,e],
[e,e, , , , ,e, , , ,e, , , , , , , , , ],
[ , , ,e, ,n, , , ,e, , ,e, ,e, ,e, ,e, ],
[ ,n, , ,e, ,e, , , , , , , ,n, , , ,n, ],
[e,e, , ,e,e, , ,e,n, ,e, ,e, ,e, ,e, ,e],
[e, ,e, ,e, , ,e,e,e, , ,e, , , ,e, , ,e],
[ , , , ,e, , , , , ,e, ,n, ,e, , ,n, , ],
[ , ,e, ,n, ,e, ,e, , , ,e, ,n, , ,e, , ],
[ , , ,e, ,e, ,e, ,n,e,e, , ,e,e, , ,e, ]]
Входные данные:
[[e,e],
[e,e]]
Выход:
null
источник
0
,1
и2
или подобное?Ответы:
Python 3 ,
558511509 байтПопробуйте онлайн!
Это очень странно, но я не знаю достаточно о Python для дальнейшей оптимизации. Я узнал кое-что из ответа Овса, так что это было весело.
Входные данные (модифицированные для облегчения написания тестовых случаев ) ожидают '' или 'e', в то время как выходные данные используют '', 'n' для обнуляющего значения и 'x' для обнуляемого излучателя. Функция принимает ожидаемый вклад, который был описан в вопросе.
Я установил переменные e, w, n и d снаружи, потому что их можно было легко заменить числами, и, если ввод и вывод были изменены, чтобы также использовать числа, он вывел бы то же самое. Я использовал буквы, потому что они сделали их более читаемыми при работе над ними.
Веселый вопрос, ОП! Creeper World великолепен, и это было отличное вдохновение для вопроса :)
Изменить: -47 байтов благодаря Эрик Outgolfer
источник
Python 2 ,
267263 байтаПопробуйте онлайн!
0
для эмиттера,2
для нуля и1
для пустого пространства.источник
Wolfram Language (Mathematica) ,
173168 байтПопробуйте онлайн!
Решает самый большой тестовый случай за 1 секунду .
Полная программа. Как функция, он короче, всего 130 байтов .
Используйте
,
0
для1
дляn
и2
дляe
.Эта программа может быть использована для преобразования из формата ввода в вызове.
Если нет никакого решения он выдаст сообщение об ошибке ,
lpdim
как это , илиlpsnf
как это .Используемая версия
Outer
(хотя и более читаемая) на 2 байта длиннее, несмотря на краткое названиеOuter
: Попробуйте онлайн!Объяснение.
Обратите внимание, что это может быть сведено к задаче целочисленного линейного программирования.
Каждая
e
ячейка имеет фиксированное значение 2, каждая пустая ячейка является целочисленной переменной, которая может быть0
(пустой) или1
(нулевым). Список координат переменных хранится в переменнойp
. (Position
с вt
том, что есть0
)Цель состоит в том, чтобы минимизировать количество используемых нулевых значений, поэтому сумма этих целочисленных переменных должна быть минимизирована. (
1&/@p
вектор состоит из всех1
и имеет длину, равную длинеp
's, обозначает целевую функцию)2
q
Это формулируется с помощью матрицы
m
=(xBoole[Norm[x-#]^2<6]&/@p)/@q
(для каждого элемента вq
, создайте строку с элементами,1
если квадрат расстояния (Norm
) до соответствующей координаты вp
меньше6
) и векторb
=1&/@q
.После этого
ReplacePart
иThread
«применяет» значения переменныхt
и распечатывает их.источник
Echo
может использоваться вместо,Print
но вывод содержит предшествующий>>
.1^p
, не работает (вместо1&/@p
).