바늘에서 건초 더미를 찾으십시오


18

건초 더미에서 바늘을 찾는 과정에서 정확히 하나의 바늘이 들어있는 가장 큰 연속 건초 더미를 찾아야합니다 . 대각선의 셀은 왼쪽 / 오른쪽 / 위 / 아래로만 연결할 수 없습니다.

입력

'N'(바늘) 및 '#'(헤이) 문자 의 배열 (또는 여러 사용자 입력 행, 선택) 입력은 두 문자 만 포함하며 각각 하나 이상을 포함해야합니다. 예를 들면 다음과 같습니다.

N#N#N
#NN##
###N#
N##N#

산출

가능한 가장 큰 유효한 건초 더미의 크기입니다. 이 예에서는 11을 출력합니다 (11 개의 건초와 1 개의 바늘이 있음).

   # 
#  ##
###N#
 ## #

이것은 이므로 가장 짧은 코드가 승리합니다. 표준 허점 제한이 적용됩니다.

테스트 사례

왼쪽에 입력, 오른쪽에 가능한 최대 건초 더미

사례 1 : 4

N##    ##
NN#     #
#NN     N
#N#     #

사례 2 : 7

###   ###
N#N    # 
NNN    N 
###   ###

사례 3:10

N###N    ### 
#N#N#   #N#  
#N#N#   # #  
N###N    ###

사례 4:10

N#N#N        
#N#N#   # # #
##N##   ##N##
#N#N#   # # #
N#N#N        

사례 5 : 1

NN#NN        
NNNNN         
#NNN#   #N    
NN#NN        

답변:


4

자바 스크립트 (ES6), 152 바이트

s=>[...s].map((n,i)=>n>'M'&&(a=[...s],a[i]=r=1,a.map(_=>a.map((c,j)=>c=='#'&&a[j+1]|a[j-1]|a[j+l]|a[j-l]?a[j]=++r:0)),o=r>o?r:o),o=0,l=~s.search`
`)|o-1

설명

입력의 각 바늘에 대해 바늘을 건초 더미의 일부로 설정하고 (0이 아닌 숫자로 설정하여 표시됨) 건초 셀을 지속적으로 검사합니다. 건초에 건초 더미의 인접한 부분이 포함 된 경우 건초 더미의 일부를 설정하고 건초 더미의 크기를 증가시킵니다. 가장 높은 결과를 출력합니다.

var solution =

s=>
  [...s].map((n,i)=>n>'M'&&(          // for each needle in s at index i
      a=[...s],                       // a = array of each character in s
      a[i]=1,                         // set the starting needle to 1 (haystack)
      r=0,                            // r = haystack size starting from this needle
      a.map(_=>                       // loop to ensure the complete haystack is found
        a.map((c,j)=>                 // for each cell c at index j
          c=='#'&&                    // if the current cell is hay
          a[j+1]|a[j-1]|a[j+l]|a[j-l] // and any adjacent cells are part of the haystack
          ?a[j]=++r:0                 // add the current cell to the haystack, increment r
        )
      ),
      o=r>o?r:o                       // o = max of o and r
    ),
    o=0,                              // o = final output, initialise to 0
    l=~s.search`
`                                     // l = line length of s
  )
  |o                                  // return o
<textarea id="input" rows="6" cols="40">N#N#N
#N#N#
##N##
#N#N#
N#N#N</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


4

루비, 207

->a{d=->b{0...b.size}
f=c=s=->y,x{(d[a]===y&&d[a[0]]===x&&!f[y][x]&&a[y][x]==c)?(c,f[y][x]=?#,1
1+s[y,x-1]+s[y,x+1]+s[y-1,x]+s[y+1,x]):0}
d[a].map{|y|d[y].map{|x|f,c=a.map{|b|b.map{p}},?N
s[y,x]}.max}.max-1}

이것은 입력을 배열의 배열로 취하는 익명 함수입니다. 용법:

f=->a{......}

f["
N##
NN#
#NN
#N#
".strip.split.map(&:chars)] # => 4

proc는 s재귀 적으로 특정 좌표에서 바늘로 건초 더미의 크기를 찾고 건초 더미의 각 바늘에서 호출됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.