Encuentra los postes de la cerca

11

Antecedentes

¡Ha explotado una bomba atómica cerca de la fábrica de postes de cerca! Dado que las cercas son esenciales para la supervivencia de nuestra civilización, debemos rescatar a la mayor cantidad posible. Estamos enviando robots resistentes a la radiación para buscar en el área, y es su tarea programar su visión artificial.

Entrada

Su entrada es una cuadrícula rectangular de los caracteres |-#, que representa dos tipos de piezas de poste de cerca y escombros, dados como una cadena delimitada por una nueva línea. Los postes de la cerca han sido horriblemente mutilados por la explosión, y algunos incluso han sido fusionados por el calor. Definimos un poste de cerca candidato como un patrón horizontal que comienza y termina |y tiene uno o más -s entre ellos (como |-|o |---|no ||), o un patrón vertical que comienza y termina -y tiene uno o más |s entre ellos (esencialmente un poste de cerca candidato horizontal rotó 90 grados). Un poste de cerca real es un poste de cerca candidato que no comparte ninguna de sus partes con otro poste de cerca candidato.

Salida

Su salida es el número de postes de cerca reales en la cuadrícula de entrada.

Ejemplo

Considere la cuadrícula de entrada

|#|-|#|##
#||--|||#
###|#|--#
###-||--|
-#-|#-|#-
#---#-#-|
#-#-|#--|

Hay 5 cercas candidatas en esta cuadrícula, pero solo 2 de ellas son cercas reales (en negrita). Por lo tanto, la salida correcta es 2.

Reglas

Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.

Casos de prueba adicionales

Entrada:

##--
||##
-#|-
|#|#

Salida: 0(0 candidatos de cercas)

Entrada:

-##|-##--
#|#-|#||-
--|-#|#||
##||||-##
||#|--|-|
-#|-#--|#
|####|#-#

Salida: 0(5 postes de cerca candidatos)

Entrada:

#|--|---|-|#
####|##--||-
-|-##||#|---
-#|#-|-#-|||
#|-##--###|-
---#-||-#-##
#|---|###|-#
-|---#-#|#|#
|#--|####-|-

Salida: 4(8 postes de cerca candidatos)

Entrada:

-|-||---##|#
---|######-#
####-##|#--|
|||##|#-||||
####-#-||-#|
---#--|#-#--
-|#-####-##-
#||-|-|-###|
|-##||-||-#-

Salida: 5(7 postes de cerca candidatos)

Entrada:

|#-|#|#-###|#-#
----#####|#----
|#--#-##-#|##-|
|#-|#-|--##||--
||#-#---##|||##
#|#-|||-#-#--||
--#|-||#|--|#|#
-#-|###||-#--#|
-#||-|#-##||##|
|--|-|||-##|-#|

Salida: 4(9 cercas candidatas)

Entrada:

||-|-|-##-#-#-|#--#-
-##|-#|-#-##-|#|--|-
||#---###||-|#|##|-#
#||-#-#-|---|#||#|##
-#-###-##-|-#-|-#||#
##-#--#||-----||-|##
-|--#-#-#|---#-#|#-#
###|-|#-#|-|###|#-|#
#||#-#|--|-||#------
||##|-||#-|--#|#-#-#
|#-|-#-|-|--##-#|||#
-|#--#||##---##|-##-
#|-|-|-||-||#-#-|##-
|-#|##|-|#|#|--||#--

Salida: 9(30 postes de cerca candidatos)

Zgarb
fuente
Entonces, ¿son los puntos en los |--...--|comodines de patrón? ¿Eso significa que las cercas horizontales deben tener al menos 5 guiones? Estoy un poco confundido por la notación.
BMac
@BMac Se supone que son puntos suspensivos, lo que significa que se omiten algunos guiones. Estoy de acuerdo en que no es la notación más clara. Déjame pensar en algo menos ambiguo.
Zgarb
Si escribimos una función, puede tomar un argumento de matriz 2D como entrada, por ejemplo. [[-,|,-],[#,#,-],[-,-,|]]?
blutorange
@blutorange No, en este desafío debe ser una sola cadena.
Zgarb

Respuestas:

3

Rubí, 266 268 bytes

Para comenzar esto. Aprovecha el hecho de que las variables apuntan a objetos (una cadena de 1 carácter para cada elemento de la matriz 2D) para eliminar los candidatos superpuestos.

P.ej. si ejecuta a="s";b=a, ambos ay bapuntan a la misma cadena. "test"=="test"devuelve verdadero, pero "test".equal?("test")devuelve falso, porque hemos creado dos objetos String diferentes.

->d{c=->d,f,v,u{i=0
r=[]
d.map{|y|j=0
e=[]
y.map{|x|f[j]||=[]
f[j][i]=x
x==v ?e[1]?r<<e+[x]&&e=[x]:e[0]?e=[x]:e<<x :x==u&&e[0]?e<<x :e=[]
j+=1}
i+=1}
r}
y=c[d.split.map(&:chars),f=[],?|,?-]+c[f,[],?-,?|]
y.count{|x|y.all?{|q|x.equal?(q)||!(q+x).uniq!(&:object_id)}}}

Casos de prueba en ideona .

blutorange
fuente
1
puedes usar en maplugar deeach
Cristian Lupascu
@ w0lf gracias, aplicado. Lo curioso es que yo debería haber sabido que ...
Blutorange