Encontre os postes de vedação

11

fundo

Uma bomba atômica explodiu perto da fábrica de cercas! Como os postes da cerca são essenciais para a sobrevivência de nossa civilização, precisamos resgatar o maior número possível. Estamos enviando robôs resistentes à radiação para pesquisar na área, e é sua tarefa programar a visão artificial deles.

Entrada

Sua entrada é uma grade retangular de caracteres |-#, representando dois tipos de peças e escombros do cercado, dados como uma sequência delimitada por nova linha. Os postes da cerca foram terrivelmente mutilados pela explosão, e alguns até foram fundidos pelo calor. Definimos um muro de vedação candidato como um padrão horizontal que inicia e termina em |e tem um ou mais -s entre eles (iguais |-|ou |---|não ||), ou um padrão vertical que inicia e termina em -e tem um ou mais |s entre eles (essencialmente um poste horizontal candidato rodava 90 graus). Um muro de vedação real é um muro de vedação candidato que não compartilha nenhuma de suas partes com outro muro de vedação candidato.

Resultado

Sua saída é o número de postes reais na grade de entrada.

Exemplo

Considere a grade de entrada

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

Existem 5 postes de vedação candidatos nesta grade, mas apenas 2 deles são postes de vedação reais (mostrados em negrito). Assim, a saída correta é 2.

Regras

Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.

Casos de teste adicionais

Entrada:

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

Saída: 0(0 postagens de vedação do candidato)

Entrada:

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

Saída: 0(5 postes de vedação do candidato)

Entrada:

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

Saída: 4(8 postes de vedação do candidato)

Entrada:

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

Saída: 5(7 postes de vedação do candidato)

Entrada:

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

Saída: 4(9 postes de vedação do candidato)

Entrada:

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

Saída: 9(30 postes de vedação do candidato)

Zgarb
fonte
Então, os períodos nos |--...--|curingas padrão? Isso significa que cercas horizontais precisam ter pelo menos 5 hífens? Estou um pouco confuso com a notação.
BMac
@BMac Eles deveriam ser reticências, o que significa que alguns hífens são omitidos. Concordo que não é a notação mais clara. Deixe-me pensar em algo menos ambíguo.
Zgarb
Se escrevermos uma função, pode-se usar um argumento de matriz 2D como entrada, por exemplo. [[-,|,-],[#,#,-],[-,-,|]]?
Blotange
@blutorange Não, neste desafio ele precisa ser uma única sequência.
Zgarb 21/05

Respostas:

3

Ruby, 266 268 bytes

Para começar isso. Utiliza o fato de que as variáveis ​​apontam para objetos (uma string de 1 caractere para cada elemento da matriz 2D) para eliminar candidatos sobrepostos.

Por exemplo. se você executar a="s";b=a, ambos ae baponte para a mesma sequência. "test"=="test"retorna true, mas "test".equal?("test")retorna false, porque criamos dois 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 teste em ideone .

blutorange
fonte
1
você pode usar mapem vez deeach
Cristian Lupascu
@ w0lf obrigado, aplicado. engraçado é que eu deveria saber que ...
blutorange