查找栅栏


11

背景

原子弹在栅栏工厂附近爆炸了!由于栅栏对于我们的文明生存至关重要,因此我们必须营救尽可能多的人。我们正在派出抗辐射的机器人搜索该区域,对它们的人工视觉进行编程是您的任务。

输入值

输入的字符是一个矩形网格|-#,代表两种栅栏部分和瓦砾,以换行符分隔的字符串形式给出。爆炸造成的伤势严重,有些甚至被高温融化了。我们将候选栅栏定义为开始于此并且结束于它们之间|并且具有一个或多个-s 的水平模式(例如|-||---|不是||),或者是开始于并且结束于其之间-具有一个或多个|s 的垂直模式。水平候选栅栏旋转90度)。一个实际的栅栏柱是候选栅栏柱不与另一位候选人栅栏柱共享任何部件。

输出量

您的输出是输入网格中实际栅栏的数量。

考虑输入网格

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

此网格中有5个候选栅栏,但其中只有2个是实际栅栏(以粗体显示)。因此正确的输出是2

规则

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。

其他测试用例

输入:

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

输出:0(0个候选栅栏)

输入:

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

输出:0(5个候选栅栏)

输入:

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

输出:4(8条候选栅栏)

输入:

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

输出:5(7个候选栅栏)

输入:

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

输出:4(9个候选栅栏)

输入:

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

输出:9(30个候选栅栏)


那么|--...--|模式通配符中的句点是吗?这是否意味着水平栅栏必须至少包含5个连字符?我对表示有点困惑。
BMac 2015年

@BMac应该是省略号,表示省略了一些连字符。我同意这不是最清楚的表示法。让我想到一些不那么模棱两可的东西。
Zgarb 2015年

如果我们编写一个函数,例如它可以将一个2D数组参数作为输入。[[-,|,-],[#,#,-],[-,-,|]]
blutorange

@blutorange不,在此挑战中,它必须是单个字符串。
Zgarb 2015年

Answers:


3

Ruby,266 268字节

首先开始。利用变量指向对象(2D数组的每个元素为1个字符的字符串)的事实来消除重叠的候选对象。

例如。如果执行 a="s";b=a,既ab指向同一个字符串。"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)}}}

测试用例 亚立酮的


1
您可以使用map代替each
Cristian Lupascu 2015年

@ w0lf谢谢,申请了。有趣的是,我应该知道……
blutorange
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.