优化我的消零器


12

我是《爬行者世界》游戏的忠实粉丝,尤其是续集。您无需知道该游戏如何回答问题,我只想提及我的问题源自何处。

在游戏中,您的目标是使用被称为“消音器”的武器消灭正在产生爬行者的发射器。

消零器可以破坏该半径范围内的任何发射器:

 eee
eeeee
eenee
eeeee
 eee

每个无效器可以针对多个发射器。

你的目标

给定一个模拟2D映射的数组,该映射由空无和带有您想要的任何字符的发射器组成,可以是空格e或数字-只需确保它们是可区分的,输出具有最佳数量的nullifiers n(或您想要的内容)的同一映射)放置,以便使用最少数量的无效符销毁发射器。

如果有多种最佳方式可以做到这一点,那么只输出一种就可以了。但是,如果任务无法解决,例如说发射器太多,没有布局会碰到所有发射器,则必须输出明显不同的东西,null就足够了

快速规则:

  • 输入:多维数组
  • 输入将包含两个字符,分别表示无意义发射器,包括答案中的内容
  • 输出:多维数组
  • 输出将包含三个字符,表示发射器无效,或者如果输入不可解决则为可区分的输出
  • 您只能用无效符替换字符
  • 无效符可以击中多个发射器,并且始终击中范围内的所有
  • 无效词可以击中上面指定的区域,并且将始终击中它可以瞄准的所有发射器
  • 以字节为单位的最短答案获胜
  • 禁止出现标准漏洞

例子

输入:

[[ , ,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

我可以使用01以及2或类似的?
user202729

@ user202729是的,只要您指定什么是并保持一致,即IE,如果输入中的发射器为1,则输出中的发射器也必须为1
Troels MB Jensen

1
我喜欢爬行世界,它总是满足,终于铲除爬行的痕迹决赛
乔金

1
@ edc65 代码高尔夫的全部重点是在不关心运行时的情况下最小化代码大小。
user202729

2
我也爱爬行世界!
orlp

Answers:


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变量设置在外部,因为它们可以很容易地用数字替换,并且,如果将输入和输出也修改为使用数字,它将输出相同的内容。我之所以使用字母,是因为它们使它在工作时更具可读性。

有趣的问题,OP!爬山虎世界很棒,这是一个很酷的灵感问题:)

编辑:-47字节感谢外长艾里克(Erik the Outgolfer)


8
抱歉,但这似乎不是一个竞争激烈的项目。建议您在没有时间对其进行优化之前将其删除。
暴民埃里克(Erik the Outgolfer)

2
糟糕,我的天哪!编辑给我最大的能力
GammaGames

1
每个缩进级别实际上不需要2个空格,1个就足够了。
暴民埃里克(Erik the 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语言(Mathematica)173168字节

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用于n2e

该程序可用于在质询中从输入格式转换。

如果没有解决方案,将打印错误消息lpdim这样,还是lpsnf喜欢这样

使用的版本Outer(虽然更具可读性)长2个字节,尽管它的简称是Outer在线尝试!


说明。

注意,这可以简化为整数线性规划问题。

每个e单元格固定为2,每个空单元格是一个整数变量,可以为0(空)或1(空值)。变量的坐标列表存储在variable中p。(在Position以s t0

目的是最小化使用的无效符的数量,因此必须最小化那些整数变量的总和。(1&/@p一个向量由全部组成,1并且长度等于p的长度,表示目标函数)

2q6

这由矩阵m= (xBoole[Norm[x-#]^2<6]&/@p)/@q(对于in中的每个元素q,用与之对应的in 1的平方距离(Normp小于的元素创建行6)和vector b=表示1&/@q

之后ReplacePartThread“适用”的变量值t和打印。


Echo可以代替,Print但输出包含一个previous >>
user202729

不幸的是,1^p它不起作用(代替1&/@p)。
user202729
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.