Encuentra el pajar en las agujas

18

En un giro en la búsqueda de una aguja en un pajar, debe encontrar el pajar contiguo más grande que contiene exactamente una aguja . Tenga en cuenta que no puede conectar celdas en diagonales, solo izquierda / derecha / arriba / abajo.

Entrada

Una matriz (o varias líneas de entrada del usuario, su selección) de caracteres 'N'(agujas) y '#'(heno). La entrada solo contiene esos dos caracteres y debe contener al menos uno de cada uno. Por ejemplo:

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

Salida

El tamaño del pajar válido más grande posible. Para nuestro ejemplo, obtendríamos 11 (hay 11 piezas de heno y una aguja).

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

Este es el , por lo que gana el código más corto. Se aplican restricciones de escapatoria estándar.

Casos de prueba

Entrada a la izquierda, posible pajar máximo a la derecha

Caso 1: 4

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

Caso 2: 7

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

Caso 3:10

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

Caso 4:10

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

Caso 5: 1

NN#NN        
NNNNN         
#NNN#   #N    
NN#NN        
Adam Martin
fuente

Respuestas:

4

JavaScript (ES6), 152 bytes

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

Explicación

Para cada aguja en la entrada, establece la aguja en una parte del pajar (representada estableciéndola en un número distinto de cero) y verifica continuamente las celdas de heno. Si el heno contiene una parte adyacente de la pila de heno, también lo establece como parte del pajar e incrementa el tamaño de la pila de heno. Produce el resultado más alto.

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>

usuario81655
fuente
4

Rubí, 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}

Esta es una función anónima que toma la entrada como una matriz de matrices. Uso:

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

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

El proceso nombrado srecursivamente encuentra el tamaño del pajar con aguja en coordenadas específicas y se llama en cada aguja en el pajar.

afuo
fuente