骑士填充网格


15

骑士填充是利用骑士棋子的连通性进行的洪水填充。特别:

 1 1
1   1
  0
1   1
 1 1

(0是初始点,1s表示连接的单元格)

挑战

给定空间和墙壁的2D网格以及初始位置,请对该网格执行骑士填充。最短的代码获胜。

规则

  • 您可以采用任何喜欢的格式(图像,字符串,数组等)输入并产生输出。您可以将初始位置作为输入网格的一部分或作为单独的坐标。为了便于说明,将使用以下格式:

    ########    # = wall
    ########    x = initial location
    ## x  ##
    ##    ##
    ########
    ##    ##
    ########
    ########
    
  • 输出是输入栅格的副本,其中添加了骑士填充结果

  • 您的填充不得与空间或墙壁使用相同的“颜色”,而应与初始位置标记相同。例如,给定上面的图像,有效的输出将是:

    ########    # = wall
    ########    @ = fill (could also have been x)
    ## @ @##
    ## @ @##
    ########
    ##@ @ ##
    ########
    ########
    
  • 您可以假设输入网格的所有侧面始终包含2单元墙

  • 您可能会假设初始位置永远不会在墙内
  • 您可能会假设网格永远不会大于1000x1000
  • 内置的很好
  • 最短代码(以字节为单位)获胜

测试用例

在所有测试用例中,#表示一堵墙,表示空白,并x表示填充物的初始位置。@表示输出填充。

Input 1:

########
########
## x  ##
##    ##
########
##    ##
########
########

Output 1:

########
########
## @ @##
## @ @##
########
##@ @ ##
########
########

Input 2:

############
############
## ##    x##
## ##     ##
#####     ##
##        ##
############
############

Output 2:

############
############
## ##@@@@@##
##@##@@@@@##
#####@@@@@##
## @@@@@@@##
############
############

Input 3:

####################
####################
##  ##            ##
##  ##            ##
##  ##  ########  ##
##  ##  ########  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ##    ##  ##
##  ##  ########  ##
##  ##  ########  ##
##  ##        ##  ##
##  ##       x##  ##
##  ############  ##
##  ############  ##
##                ##
##                ##
####################
####################

Output 3:

####################
####################
##@@##@@@@@@@@@@@@##
##@@##@@@@@@@@@@@@##
##@@##@@########@@##
##@@##@@########@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@##    ##@@##
##@@##@@########@@##
##@@##@@########@@##
##@@##@@@@@@@@##@@##
##@@##@@@@@@@@##@@##
##@@############@@##
##@@############@@##
##@@@@@@@@@@@@@@@@##
##@@@@@@@@@@@@@@@@##
####################
####################

Input 4:

################
################
##           ###
##     x     ###
##  #######  ###
##  #######  ###
##  ##   ##  ###
##  ##   ##  ###
##  ##   ##  ###
##  ########  ##
##  ########  ##
##        ##  ##
##        ##  ##
################
################

Output 4:

################
################
##   @   @   ###
## @   @   @ ###
##  #######  ###
##@ ####### @###
##  ##   ##  ###
## @##   ##@ ###
##  ##   ##  ###
##@ ########@ ##
##  ########  ##
## @   @  ## @##
##   @   @##  ##
################
################

Input 5:

##############
##############
##         ###
##         ###
##         ###
##   ###   ###
##   #x#   ###
##   ###   ###
##         ###
##         ###
##         ###
##############
##############

Output 5:

##############
##############
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@###@@@###
##@@@#@#@@@###
##@@@###@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##@@@@@@@@@###
##############
##############

Answers:


4

八度,73字节

function a=F(s,a)do;b=a;until(a=~s&imdilate(a,de2bi(")0#0)"-31)))==b;a+=s

在线演示!

*某些更改适用于在rextester中运行。

该函数将0和2的2d数组作为墙并将0和1的数组作为初始位置,并输出0&1和2的数组。


看起来不错,但是pkg load ...在测试框架之外运行时不需要吗?如果imdilatede2bi在没有显式导入的情况下可用,那很好。
戴夫

@Dave在以前的octave版本中,包括在tio中安装的版本,可以安装软件包以使其可以自动加载,但是现在我注意到此功能已从octave中删除!请看这个
rahnema17年

很公平。只要您以-auto删除之前的版本为目标,就没有问题,而且我猜这个答案不会使用任何新功能。
戴夫

3

JavaScript(ES6),116个字节

f=(s,l=s.search`
`,t=s.replace(eval(`/(x| )([^]{${l-2}}(....)?|[^]{${l+l}}(..)?)(?!\\1)[x ]/`),'x$2x'))=>s==t?s:f(t)

v=(s,l=s.search`
`)=>!/^(#+)\n\1\n[^]*x[^]*\n\1\n\1$/.test(s)|s.split`
`.some(s=>s.length-l|!/^##.+##$/.test(s))&&`Invalid Input`
textarea{font-family:monospace}
<textarea rows=11 cols=33 oninput=o.value=v(this.value)||f(this.value)></textarea><textarea rows=11 cols=33 id=o reaodnly></textarea>

根据我对“ 检测失败的城堡”的回答。使用填充x


您可以添加测试代码段/链接吗?
Officialaimm

2

Python 3 394 387 381 356 352 347个319 313 154 139字节

  • 仅计算核心功能而不是与I / O格式化有关的功能后的154个字节
  • 保存了7个字节:感谢@Jacoblaw和@ Mr.Xcoder: except:0
  • 保存了28个字节!!!:感谢@ovs:摆脱了 try: except障碍和其他高尔夫运动
  • 感谢@Dave提供了漂亮的测试模块。
  • 保存6个字节:g[(a,b)]正好g[a,b]
  • @nore保存了15个字节!!!
def x(g,a,b,m):
 if(a,b)in g and"!">g[a,b]or m:
  g[a,b]="@"
  for i in 1,2,-1,-2:
   for j in 3-abs(i),abs(i)-3:g=x(g,a+i,b+j,0)
 return g

在线尝试!


1
你能except:pass代替吗?
jacoblaw17年

1
我敢肯定,这可以很大程度上golfed
Xcoder先生

2
@jacoblaw甚至更好:except:0
Xcoder先生


1
这是TiO的易于测试的版本:在线试用!
戴夫

1

Mathematica,117个字节

通常的故事:强大的内置功能但长名…

HighlightGraph[g,ConnectedComponents[h=Subgraph[g=KnightTourGraph@@Dimensions@#,Flatten@#~Position~1],#2]~Prepend~h]&

在Wolfram沙箱中尝试!

它需要两个输入:第一个是输入网格,作为一个数组 0 s(对于墙壁)和1s(对于空间),然后是起始位置的单个整数,该整数是通过沿从上到下的行对网格进行编号而找到的,例如

1  2  3  4  5
6  7  8  9  10
11 12 13 14 ...

您可以像这样调用函数HighlightGraph[...~Prepend~h]&[{{0,0,...,0}, {0,0,...,0}, ..., {0,0,...,0}}, 20]

KnightTourGraph函数构造一个图形,该图形的顶点对应于网格中的位置,而边缘对应于有效的骑士移动,然后我们获取Subgraph非壁的顶点的,并找到ConnectedComponents起始顶点的。输出是一个图形(显示为逆时针旋转90º),非墙壁顶点突出显示为红色,填充的顶点突出显示为黄色。例如,对于第一个测试用例,输出如下所示:

测试案例1的输出:突出显示某些区域的图形


好吧,这看起来似乎是最难测试的!对于我们大学时代以来从未接触过Mathematica的我们来说,您能为在沙箱中添加一个如何调用它的示例吗?我的尝试f=... f[{0,...,0;0,...,0}, 19]和类似尝试都惨败。
戴夫

@Dave,您可以使用HighlightGraph[g,ConnectedComponents[h=Subgraph[g=KnightTourGraph@@Dimensions@#,Flatten@#~Position~1],#2]~Prepend~h]&[{{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,1,1,1,1,0,0},{0,0,1,1,1,1,0,0},{0,0,0,0,0,0,0,0},{0,0,1,1,1,1,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}},20](对于第一个测试用例)调用该函数。我已将其编辑为问题-抱歉,它并非一开始就存在!
不是一棵树
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.