Trouvez les clôtures

11

Contexte

Une bombe atomique a explosé près de l'usine de clôture! Puisque les poteaux de clôture sont essentiels à la survie de notre civilisation, nous devons en sauver autant que possible. Nous envoyons des robots résistants aux radiations pour fouiller la zone, et c'est votre tâche de programmer leur vision artificielle.

Contribution

Votre entrée est une grille rectangulaire des caractères |-#, représentant deux types de parties de clôture et de décombres, donnés sous forme de chaîne délimitée par des sauts de ligne. Les poteaux de clôture ont été horriblement mutilés par l'explosion, et certains ont même été fusionnés par la chaleur. Nous définissons un poteau de clôture candidat comme étant soit un motif horizontal qui commence et se termine |et a un ou plusieurs -s entre eux (comme |-|ou |---|mais pas ||), ou un motif vertical qui commence et se termine -et a un ou plusieurs |s entre eux (essentiellement un poteau de clôture candidat horizontal tourné à 90 degrés). Un poteau de clôture réel est un poteau de clôture candidat qui ne partage aucune de ses parties avec un autre poteau de clôture candidat.

Production

Votre sortie est le nombre de poteaux de clôture réels dans la grille d'entrée.

Exemple

Considérez la grille d'entrée

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

Il y a 5 poteaux de clôture candidats dans cette grille, mais seulement 2 d'entre eux sont des poteaux de clôture réels (indiqués en gras). Ainsi, la sortie correcte est 2.

Règles

Vous pouvez écrire soit un programme complet soit une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.

Cas de test supplémentaires

Contribution:

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

Sortie: 0(0 poteaux de clôture candidats)

Contribution:

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

Sortie: 0(5 poteaux de clôture candidats)

Contribution:

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

Sortie: 4(8 poteaux de clôture candidats)

Contribution:

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

Sortie: 5(7 poteaux de clôture candidats)

Contribution:

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

Sortie: 4(9 poteaux de clôture candidats)

Contribution:

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

Sortie: 9(30 poteaux de clôture candidats)

Zgarb
la source
Les périodes sont-elles donc dans les |--...--|caractères génériques? Est-ce à dire que les clôtures horizontales doivent avoir au moins 5 tirets? Je suis un peu confus par la notation.
BMac
@BMac Ils sont censés être des points de suspension, ce qui signifie que certains tirets sont omis. Je suis d'accord que ce n'est pas la notation la plus claire. Permettez-moi de penser à quelque chose de moins ambigu.
Zgarb
Si nous écrivons une fonction, peut-elle prendre un argument de tableau 2D en entrée, par exemple. [[-,|,-],[#,#,-],[-,-,|]]?
blutorange
@blutorange Non, dans ce défi, il doit s'agir d'une seule chaîne.
Zgarb

Réponses:

3

Rubis, 266 268 octets

Pour commencer. Utilise le fait que les variables pointent vers des objets (une chaîne de 1 caractère pour chaque élément du tableau 2D) pour éliminer les candidats qui se chevauchent.

Par exemple. si vous exécutez a="s";b=a, à la fois aet le bpoint à la même chaîne. "test"=="test"renvoie vrai, mais"test".equal?("test") renvoie false, car nous avons créé deux objets String différents.

->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)}}}

Cas de test sur ideone .

blutorange
la source
1
vous pouvez utiliser à la mapplace deeach
Cristian Lupascu
@ w0lf merci, appliqué. c'est drôle, j'aurais dû savoir que ...
blutorange