Knight-fill a grid
Octave, 73 bytes
function a=F(s,a)do;b=a;until(a=~s&imdilate(a,de2bi(")0#0)"-31)))==b;a+=s
Online Demo!
*Some changes applied to run in rextester.
A function that takes a 2d array of 0 & 2 as wall and an array of 0 & 1 as initial location and outputs an array of 0 & 1 & 2.
JavaScript (ES6), 116 bytes
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>
Based on my answer to Detect Failing Castles. Fills using x
s.
Python 3, 394 387 381 356 352 347 319 313 154139 bytes
- 154 bytes after only counting the core function and not the function concerning I/O formatting
- saved 7 bytes: thanks to @Jacoblaw and @Mr.Xcoder:
except:0
- saved 28 bytes!!!: Thanks to @ovs: got rid of
try: except
block and several other golf - Thanks to @Dave for the beautiful test module.
- saved 6 bytes:
g[(a,b)]
as justg[a,b]
- @nore saved 15 bytes!!!:
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
Try it online!