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)


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 .


1
możesz użyć mapzamiasteach
— Cristian Lupascu

@ w0lf dzięki, zastosowano. zabawne jest to, że powinienem był wiedzieć, że ...
— blutorange
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.