Найти ограждения

11

Фон

Атомная бомба взорвалась возле завода ограждения! Поскольку ограждения необходимы для выживания нашей цивилизации, мы должны спасти как можно больше. Мы посылаем радиационно-стойких роботов для поиска в этом районе, и ваша задача - запрограммировать их искусственное зрение.

вход

Ваш ввод представляет собой прямоугольную сетку символов |-#, представляющих два вида частей ограждения и обломков, заданных в виде строки с разделителями новой строки. Ограждения были ужасно искалечены взрывом, а некоторые даже были слиты вместе жаром. Мы определяем предполагаемую точку ограждения как горизонтальный шаблон, который начинается и заканчивается |и имеет один или несколько -s между ними (как |-|или |---|нет ||), или вертикальный шаблон, который начинается и заканчивается -и имеет один или несколько |s между ними (по существу горизонтальный кандидатный забор повернут на 90 градусов). Фактический fencepost является кандидатом fencepost , который не разделяет какой - либо из его частей с другой кандидата fencepost.

Выход

Ваш вывод - это количество фактических заборов во входной сетке.

пример

Рассмотрим входную сетку

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

В этой сетке есть 5 потенциальных заборов, но только 2 из них являются действительными (показаны жирным шрифтом). Таким образом, правильный вывод 2.

правила

Вы можете написать либо полную программу, либо функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Дополнительные тестовые случаи

Входные данные:

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

Вывод: 0(0 потенциальных заборов)

Входные данные:

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

Вывод: 0(5 потенциальных заборов)

Входные данные:

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

Результат: 4(8 кандидатов на ограждения)

Входные данные:

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

Результат: 5(7 кандидатов на ограждения)

Входные данные:

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

Результат: 4(9 кандидатов на ограждения)

Входные данные:

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

Вывод: 9(30 потенциальных заборов)

Zgarb
источник
Значит, периоды в |--...--|шаблонах подстановочных знаков? Означает ли это, что горизонтальные заборы должны иметь как минимум 5 дефисов? Я немного смущен обозначениями.
BMac
@BMac Они должны быть многоточием, что означает, что некоторые дефисы опущены. Я согласен, что это не самая четкая запись. Позвольте мне думать о чем-то менее двусмысленном.
Згарб
Если мы напишем функцию, может ли она принять один аргумент 2D-массива в качестве ввода, например. [[-,|,-],[#,#,-],[-,-,|]]?
Blutorange
@blutorange Нет, в этом вызове это должна быть одна строка.
Згарб

Ответы:

3

Рубин, 266 268 байт

Чтобы начать это. Использует тот факт, что переменные указывают на объекты (1-символьная строка для каждого элемента 2D-массива), чтобы исключить перекрывающихся кандидатов.

Например. если вы выполняете a="s";b=a, оба aи bуказывают на одну и ту же строку. "test"=="test"возвращает true, но "test".equal?("test")возвращает false, потому что мы создали два разных объекта 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)}}}

Тестовые случаи на ideone .

blutorange
источник
1
Вы можете использовать mapвместоeach
Кристиан Lupascu
@ w0lf Спасибо, применил.
Самое