Finde die Zaunpfosten

11

Hintergrund

In der Nähe der Zaunpfostenfabrik ist eine Atombombe explodiert! Da Zaunpfosten für das Überleben unserer Zivilisation unerlässlich sind, müssen wir so viele wie möglich retten. Wir schicken strahlungsresistente Roboter, um das Gebiet zu durchsuchen, und es ist Ihre Aufgabe, ihre künstliche Sicht zu programmieren.

Eingang

Ihre Eingabe ist ein rechteckiges Raster der Zeichen |-#, das zwei Arten von Zaunpfosten und Trümmern darstellt und als durch neue Zeilen getrennte Zeichenfolge angegeben wird. Die Zaunpfosten wurden durch die Explosion schrecklich verstümmelt, und einige wurden sogar durch die Hitze miteinander verschmolzen. Wir definieren einen Zaunpfosten als ein horizontales Muster, das beginnt und endet |und ein oder mehrere -s zwischen sich hat (wie |-|oder |---|aber nicht ||), oder ein vertikales Muster, das beginnt und endet -und ein oder mehrere |s zwischen sich hat (im Wesentlichen) ein horizontaler Zaunpfostenkandidat, der um 90 Grad gedreht wurde). Ein tatsächlicher Zaunpfosten ist ein Kandidat für einen Zaunpfosten, der keine seiner Teile mit einem anderen Kandidaten für einen Zaunpfosten teilt.

Ausgabe

Ihre Ausgabe ist die Anzahl der tatsächlichen Zaunpfosten im Eingaberaster.

Beispiel

Betrachten Sie das Eingaberaster

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

Es gibt 5 mögliche Zaunpfosten in diesem Raster, aber nur 2 davon sind tatsächliche Zaunpfosten (fett dargestellt). Somit ist die korrekte Ausgabe 2.

Regeln

Sie können entweder ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt und Standardschlupflöcher sind nicht zulässig.

Zusätzliche Testfälle

Eingang:

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

Ausgabe: 0(0 mögliche Zaunpfosten)

Eingang:

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

Ausgabe: 0(5 mögliche Zaunpfosten)

Eingang:

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

Ausgabe: 4(8 mögliche Zaunpfosten)

Eingang:

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

Ausgabe: 5(7 mögliche Zaunpfosten)

Eingang:

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

Ausgabe: 4(9 mögliche Zaunpfosten)

Eingang:

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

Ausgabe: 9(30 mögliche Zaunpfosten)

Zgarb
quelle
Sind also die Punkte in den |--...--|Muster-Platzhaltern? Bedeutet das, dass horizontale Zäune mindestens 5 Bindestriche haben müssen? Ich bin ein bisschen verwirrt von der Notation.
BMac
@BMac Sie sollen eine Ellipse sein, was bedeutet, dass einige Bindestriche weggelassen werden. Ich stimme zu, dass es nicht die klarste Notation ist. Lassen Sie mich an etwas weniger Zweideutiges denken.
Zgarb
Wenn wir eine Funktion schreiben, kann ein 2D-Array-Argument als Eingabe verwendet werden, z. [[-,|,-],[#,#,-],[-,-,|]]?
Blutorange
@blutorange Nein, bei dieser Herausforderung muss es sich um eine einzelne Zeichenfolge handeln.
Zgarb

Antworten:

3

Ruby, 266 268 Bytes

Um dies zu starten. Nutzt die Tatsache, dass Variablen auf Objekte verweisen (eine Zeichenfolge mit 1 Zeichen für jedes Element des 2D-Arrays), um überlappende Kandidaten zu eliminieren.

Z.B. Wenn Sie ausführen a="s";b=a, zeigen beide aund bauf dieselbe Zeichenfolge. "test"=="test"Gibt true zurück, gibt jedoch "test".equal?("test")false zurück, da wir zwei verschiedene String-Objekte erstellt haben.

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

Testfälle auf ideone .

blutorange
quelle
1
Sie können mapanstelle voneach
Cristian Lupascu
@ w0lf danke, angewendet. lustig ist, ich hätte wissen müssen, dass ...
blutorange