Оптимізуйте мої нуліфікатори


12

Я великий шанувальник гри Creeper World, і особливо продовження. Вам не потрібно знати, як працює ця гра, щоб відповісти на запитання, я просто хотів зазначити, звідки походить моє запитання.

У грі ваша мета - знищити випромінювачів, які нерестують Криппер, використовуючи зброю, відому як зведений нанівець.

Нуліфікатори можуть знищити будь-який випромінювач у цьому радіусі:

 eee
eeeee
eenee
eeeee
 eee

Кожен зведений на нуль МОЖЕ націлити декілька випромінювачів.

Ваша мета

Враховуючи масив, що імітує двовимірну карту, що складається з нічого і випромінювачів з будь-якими символами, які вам подобаються, це можуть бути пробіли та e або числа - просто переконайтеся, що вони відрізняються, виведіть ту саму карту з оптимальною кількістю нульфіксаторів n (або що б ви хотіли) ) розміщені так, що випромінювачі знищуються з найменшою кількістю нуліфікаторів.

Якщо існує кілька оптимальних способів це зробити, просто вивести один із них буде добре. Якщо ж завдання не вирішується, скажімо, є стільки випромінювачів, що жоден макет ніколи не вразить усіх, ви повинні вивести щось помітно інше, нульового буде достатньо

Швидкі правила:

  • Вхід: багатовимірний масив
  • Вхід буде містити два символи, що нічого не означають, і випромінювач , включайте те, що є у вашій відповіді
  • Вихід: багатовимірний масив
  • Вихідні дані будуть містити три символи, нічого не означає , емітер та зведений нанівець АБО відмітний вихід, якщо вхід нерозв'язний
  • Ви можете замінити нічого символу на нуліфікатор
  • Нуліфікатор може вражати декілька випромінювачів, і завжди буде вражати все, що знаходиться в зоні дії
  • Нуліфікатор може потрапити в область, вказану вище, і завжди буде вражати всі випромінювачі, на які він може націлитись
  • Найкоротші відповіді в байтах виграють
  • стандартні лазівки заборонені

Приклади

Вхід:

[[ , ,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чи подібне?
користувач202729

@ user202729 Так, якщо ви вкажете що є, і дотримуйтесь його, тобто, якщо випромінювач вводиться 1, то так само він повинен бути 1 на виході
Troels MB Jensen

1
Я любив Creeper World, це завжди було задоволення, щоб остаточно ліквідувати остаточні сліди плазуна
Jo King

1
@ edc65 Вся суть коду-гольфу полягає в тому, щоб мінімізувати розмір коду, не піклуючись про час виконання.
користувач202729

2
Я теж люблю плазун світ!
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 для подальшої оптимізації. Я навчився деяких речей з відповіді ovs, так що це було весело.

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

Я встановив зовнішні змінні e, w, n та d, тому що їх можна було легко замінити цифрами, і, якщо вхід і вихід були змінені і на використання чисел, він видав би те саме. Я використовував листи, тому що вони зробили його більш читабельним під час роботи над ним.

Веселе питання, ОП! Creeper World чудовий, і це було класною натхненницею для питання :)

Редагувати: -47 байтів завдяки Еріку Переможця


8
Вибачте, але, схоже, це не серйозно конкуруючий запис. Рекомендую видалити його, поки не встигнете його оптимізувати.
Ерік Аутгольфер

2
На жаль, мій поганий! Відредаговано наскільки я
міг

1
Насправді вам не потрібні 2 пробіли для кожного рівня відступу, достатньо 1.
Ерік Аутгольфер

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

Мова Вольфрама (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. ( Positions у tтому, що є 0)

Мета - мінімізувати кількість використаних зведених нанівець рівнів, тому сума цих цілих змінних повинна бути зведена до мінімуму. ( 1&/@p, вектор складається з усієї 1довжини, рівної довжини p', позначає цільову функцію)

2q6

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

Після цього ReplacePartі Thread"застосовує" змінні значення до tта друкує його.


Echoможе використовуватися замість, Printале вихід містить попереднє >>.
користувач202729

На жаль 1^p, не працює (замість 1&/@p).
користувач202729
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.