Trova i recinti


11

sfondo

Una bomba atomica è esplosa vicino alla fabbrica di recinti! Poiché i recinti sono essenziali per la sopravvivenza della nostra civiltà, dobbiamo salvarne il maggior numero possibile. Stiamo inviando robot resistenti alle radiazioni per perquisire l'area ed è tuo compito programmare la loro visione artificiale.

Ingresso

Il tuo input è una griglia rettangolare dei caratteri |-#, che rappresenta due tipi di parti di recinzione e macerie, dati come una stringa delimitata da una nuova riga. I recinti sono stati orribilmente mutilati dall'esplosione e alcuni sono stati persino fusi insieme dal calore. Definiamo un fencepost candidato per essere o un modello orizzontale che inizia e termina |e ha una o più -s tra di loro (come |-|o |---|no ||), o un modello verticale che inizia e finisce in -e ha una o più |s tra di loro (essenzialmente un recinto candidato orizzontale ruotato di 90 gradi). Un vero fencepost è un fencepost candidato che non condivide nessuna delle sue parti con un altro fencepost candidato.

Produzione

L'output è il numero di parametri effettivi nella griglia di input.

Esempio

Considera la griglia di input

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

Ci sono 5 parametri di recinzione candidati in questa griglia, ma solo 2 di essi sono parametri di recinzione effettivi (indicati in grassetto). Quindi l'output corretto è 2.

Regole

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.

Casi di prova aggiuntivi

Ingresso:

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

Risultato: 0(0 candidati candidati)

Ingresso:

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

Risultato: 0(5 candidati candidati)

Ingresso:

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

Risultato: 4(8 candidati candidati)

Ingresso:

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

Risultato: 5(7 candidati candidati)

Ingresso:

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

Risultato: 4(9 candidati candidati)

Ingresso:

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

Risultato: 9(30 candidati candidati)


Quindi sono i punti nei |--...--|caratteri jolly del modello? Ciò significa che le recinzioni orizzontali devono avere almeno 5 trattini? Sono un po 'confuso dalla notazione.
BMac,

@BMac Dovrebbero essere dei puntini di sospensione, il che significa che alcuni trattini vengono omessi. Sono d'accordo che non è la notazione più chiara. Fammi pensare a qualcosa di meno ambiguo.
Zgarb,

Se scriviamo una funzione, può prendere un argomento di matrice 2D come input, ad es. [[-,|,-],[#,#,-],[-,-,|]]?
Blutorange,

@blutorange No, in questa sfida deve essere una singola stringa.
Zgarb,

Risposte:


3

Rubino, 266 268 byte

Per iniziare. Si avvale del fatto che le variabili puntano a oggetti (una stringa di 1 carattere per ogni elemento dell'array 2D) per eliminare i candidati sovrapposti.

Per esempio. se si esegue a="s";b=a, entrambi ae bpuntano alla stessa stringa. "test"=="test"restituisce true, ma "test".equal?("test")restituisce false, poiché abbiamo creato due diversi oggetti String.

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

Casi di prova su ideone .


1
puoi usare mapinvece dieach
Cristian Lupascu

@ w0lf grazie, applicato. La cosa divertente è che avrei dovuto
saperlo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.