Znajdź płoty

11

tło

W pobliżu fabryki ogrodzenia wybuchła bomba atomowa! Ponieważ słupy ogrodzeniowe są niezbędne do przetrwania naszej cywilizacji, musimy uratować jak najwięcej. Wysyłamy roboty odporne na promieniowanie w celu przeszukania okolicy, a Twoim zadaniem jest zaprogramowanie ich sztucznego widzenia.

Wejście

Twoje dane wejściowe to prostokątna siatka znaków |-#, reprezentująca dwa rodzaje części słupka ogrodzeniowego i gruz, podane jako ciąg rozdzielany znakiem nowej linii. Słupki ogrodzeniowe zostały okropnie okaleczone przez eksplozję, a niektóre zostały nawet połączone przez upał. Definiujemy słupek ogrodzeniowy jako poziomy wzór, który zaczyna się i kończy |i ma jeden lub więcej -s między nimi (jak |-|lub |---|nie ||), lub pionowy wzór, który zaczyna się i kończy -i ma jeden lub więcej |s między nimi (zasadniczo poziomy słup ogrodzeniowy kandydata obrócony o 90 stopni). Rzeczywisty Fencepost jest Fencepost kandydat, który nie udostępnia jakichkolwiek jego części z innego fencepost kandydującego.

Wynik

Twój wynik to liczba rzeczywistych słupków ogrodzeniowych w siatce wejściowej.

Przykład

Rozważ siatkę wejściową

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

W tej siatce znajduje się 5 kandydujących słupków ogrodzeniowych, ale tylko 2 z nich są słupkami ogrodzeniowymi (pogrubionymi czcionkami). Zatem prawidłowe wyjście to 2.

Zasady

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Dodatkowe przypadki testowe

Wejście:

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

Wyjście: 0(0 kandydujących słupków ogrodzeniowych)

Wejście:

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

Wyjście: 0(5 słupków ogrodzeniowych dla kandydatów)

Wejście:

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

Wyjście: 4(8 kandydujących słupków ogrodzeniowych)

Wejście:

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

Wyjście: 5(7 słupków ogrodzeniowych dla kandydatów)

Wejście:

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

Wyjście: 4(9 słupków ogrodzeniowych dla kandydatów)

Wejście:

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

Wyjście: 9(30 słupków ogrodzeniowych dla kandydatów)

Zgarb
źródło
Czy więc kropki we |--...--|wzorach są symbolami wieloznacznymi? Czy to oznacza, że ​​poziome ogrodzenia muszą mieć co najmniej 5 łączników? Notacja trochę mnie zdziwiła.
BMac
@BMac Mają być elipsą, co oznacza, że ​​niektóre myślniki są pominięte. Zgadzam się, że nie jest to najczystszy zapis. Pozwól mi wymyślić coś mniej niejednoznacznego.
Zgarb
Jeśli piszemy funkcję, może przyjąć jeden argument tablicy 2D jako dane wejściowe, np. [[-,|,-],[#,#,-],[-,-,|]]?
blutorange
@blutorange Nie, w tym wyzwaniu musi to być pojedynczy ciąg.
Zgarb

Odpowiedzi:

3

Rubinowy, 266 268 bajtów

Aby rozpocząć. Wykorzystuje fakt, że zmienne wskazują obiekty (1-znakowy ciąg dla każdego elementu tablicy 2D), aby wyeliminować nakładające się kandydatury.

Na przykład. jeśli wykonasz a="s";b=a, zarówno ai bwskaż ten sam ciąg. "test"=="test"zwraca true, ale "test".equal?("test")zwraca false, ponieważ stworzyliśmy dwa różne obiekty 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)}}}

Testuj przypadki na ideone .

blutorange
źródło
1
możesz użyć mapzamiasteach
Cristian Lupascu
@ w0lf dzięki, zastosowano. zabawne jest to, że powinienem był wiedzieć, że ...
blutorange