Знайдіть огорожі


11

Фон

Атомна бомба вибухнула біля заводу огорожі! Оскільки огорожі є важливими для виживання нашої цивілізації, ми повинні врятувати їх якомога більше. Ми направляємо радіостійких роботів для пошуку району, і ваше завдання запрограмувати їх штучне бачення.

Вхідні дані

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

Вихідні дані

Ваш вихід - це кількість фактичних огороджень у вхідній сітці.

Приклад

Розглянемо вхідну сітку

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

У цій сітці є 5 кандидатів огорож, але лише 2 з них - це фактичні забори (показані жирним шрифтом). Таким чином, правильний вихід 2.

Правила

Ви можете написати або повну програму, або функцію. Виграє найменший байт, а стандартні лазівки заборонені.

Додаткові тестові випадки

Вхід:

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

Вихід: 0(0 кандидатських огорож)

Вхід:

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

Вихід: 0(5 кандидатських огорож)

Вхід:

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

Вихід: 4(8 кандидатських огорож)

Вхід:

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

Вихід: 5(7 кандидатських огорож)

Вхід:

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

Вихід: 4(9 кандидатських огорож)

Вхід:

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

Вихід: 9(30 кандидатських огорож)


Тож чи періоди у |--...--|шаблоні маклерів? Це означає, що горизонтальні огорожі повинні мати не менше 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 .


1
ви можете використовувати mapзамістьeach
Крістіан Лупаску

@ w0lf дякую, застосовано. дивна річ, я мав би знати, що ...
blutorange
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.