그리드를 기사 채우기


15

기사 채우기는 기사 체스 조각의 연결성을 사용하는 플러드 채우기입니다. 구체적으로 특별히:

 1 1
1   1
  0
1   1
 1 1

(0은 초기 점이며, 1은 연결된 셀을 나타냅니다)

도전

공간과 벽의 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:

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

답변:


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의 2 차원 배열을 벽으로, 0과 1의 배열을 초기 위치로 사용하여 0과 1과 2의 배열을 출력하는 함수입니다.


좋아 보이지만 pkg load ...테스트 프레임 워크 외부에서 실행할 때 이것이 필요하지 않습니까? 명시 적 수입없이 imdilate& de2bi를 사용할 수 있다면 괜찮습니다.
Dave

@Dave tio에 설치된 버전을 포함하여 이전 버전의 옥타브에서는 자동으로로드 할 수 있도록 패키지를 설치할 수 있었지만 이제이 기능은 옥타브에서 제거되었습니다! 이것을 참조 하십시오 .
rahnema1

그럴 수 있지. 이전 버전을 타겟팅하는 한 -auto문제가 없으며이 답변에 새로운 기능이 사용되지 않는 것 같습니다.
Dave

3

자바 스크립트 (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>

Failing Castles 에 대한 나의 답변에 근거 함 . xs를 사용하여 채 웁니다 .


테스트 스 니펫 / 링크를 추가 할 수 있습니까?
officialaimm

2

파이썬 (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대신 할 수 있습니까?
jacoblaw 2016 년

1
나는 이것이 엄청나게 골프를 칠 수 있다고 확신합니다
Mr. Xcoder

2
@jacoblaw 더 나은 :except:0
Mr. Xcoder


1
다음은 약간 테스트하기 쉬운 TiO 버전입니다. 온라인에서 사용해보십시오!
Dave

1

수학, 117 바이트

일반적인 이야기 : 강력한 내장 기능이지만 긴 이름…

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

Wolfram 샌드 박스에서 사용해보십시오!

먼저 두 개의 입력이 필요합니다. 먼저 입력 그리드는 0s (벽의 경우) 및 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

@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](첫 번째 테스트 경우)로 함수를 호출 할 수 있습니다 . 나는 그것을 질문에 편집했다 – 미안 그것은 처음부터 거기에 없었다!
나무가 아닙니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.