Оптимизировать мои нулификаторы

12

Я большой поклонник игры 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или подобное?
user202729
@ user202729 Да, если вы укажете, что есть что, и сохраните его согласованным, т.е. если IE на входе излучателя равен 1, то на выходе также должно быть 1
Troels MB Jensen
1
Я любил Creeper World, всегда было приятно окончательно уничтожить последние следы лианы
Джо Кинг,
1
@ edc65 Смысл code-golf заключается в том, чтобы минимизировать размер кода, не заботясь о времени выполнения.
user202729
2
Я тоже люблю мир Creeper!
orlp

Ответы:

4

Python 3 , 558 511 509 байт

from itertools import*
E=enumerate
L=len
def s(s):
 q=[(x,y)for y,r in E(s)for x,k in E(r)if k==w]
 for i in range(1,L(q)):
  for c in combinations(q,i):
   m=[l*1for l in s]
   for p in c:
    m[p[1]][p[0]]=n
    for y,r in E([list(r) for r in' xxx ,xxxxx,xxnxx,xxxxx, xxx '.split(',')]):
     for x,k in E(r):
      o=(p[0]-x+2,p[1]-y+2)
      if k==d and-1<o[0]<L(m[0])and-1<o[1]<L(m)and m[o[1]][o[0]]==e:
       m[p[1]-y+2][p[0]-x+2]=d
   if e not in ','.join([''.join(r)for r in m]):return(m)
print(s(m))

Попробуйте онлайн!

Это очень странно, но я не знаю достаточно о Python для дальнейшей оптимизации. Я узнал кое-что из ответа Овса, так что это было весело.

Входные данные (модифицированные для облегчения написания тестовых случаев ) ожидают '' или 'e', ​​в то время как выходные данные используют '', 'n' для обнуляющего значения и 'x' для обнуляемого излучателя. Функция принимает ожидаемый вклад, который был описан в вопросе.

Я установил переменные e, w, n и d снаружи, потому что их можно было легко заменить числами, и, если ввод и вывод были изменены, чтобы также использовать числа, он вывел бы то же самое. Я использовал буквы, потому что они сделали их более читаемыми при работе над ними.

Веселый вопрос, ОП! Creeper World великолепен, и это было отличное вдохновение для вопроса :)

Изменить: -47 байтов благодаря Эрик Outgolfer

GammaGames
источник
8
Извините, но похоже, что это не серьезно конкурирующая запись. Я рекомендую удалить его, пока у вас не будет времени оптимизировать его.
Эрик Outgolfer
2
Ой, мой плохой! Отредактировано в меру своих способностей
GammaGames
1
На самом деле вам не нужно 2 пробела для каждого уровня отступа, достаточно 1.
Эрик Outgolfer
3

Python 2 , 267 263 байта

from itertools import*
m=input()
E=enumerate
e=[(x,y)for y,a in E(m)for x,e in E(a)if e]
for n in count():
 for p in combinations(e,n):
	k=[l*1for l in m]
	for x,y in p:k[y][x]=2
	all(e+any(8>(y-Y)**2+(x-X)**2for X,Y in p)for y,a in E(m)for x,e in E(a))>0>exit(k)

Попробуйте онлайн!

0для эмиттера, 2для нуля и 1для пустого пространства.

овс
источник
1

Wolfram Language (Mathematica) , 173 168 байт

t=ToExpression@$ScriptInputString
P=Position
p=t~P~0
q=t~P~2
Print@ReplacePart[t,Thread[p->LinearProgramming[1&/@p,(xBoole[Norm[x-#]^2<6]&/@p)/@q,1&/@q,0,Integers]]]

Попробуйте онлайн!

Решает самый большой тестовый случай за 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, обозначает целевую функцию)

2q6

Это формулируется с помощью матрицы m= (xBoole[Norm[x-#]^2<6]&/@p)/@q(для каждого элемента в q, создайте строку с элементами, 1если квадрат расстояния ( Norm) до соответствующей координаты в pменьше 6) и вектор b= 1&/@q.

После этого ReplacePartи Thread«применяет» значения переменных tи распечатывает их.

user202729
источник
Echoможет использоваться вместо, Printно вывод содержит предшествующий >>.
user202729
К сожалению 1^p, не работает (вместо 1&/@p).
user202729