水最终会到达水箱吗?


30

在ASCII艺术世界中,有水,哈希墙和字母机制。

您正在由散列墙(#标志)组成的房间中:

#######
#     #
#     #
#     #
# ### #
#     #
#######

您安装了一个S水源(S标牌)和一个E水箱(E标牌),可以从任何方向接收水,但是您只有一个S水源和一个E箱。

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

因此,您必须明智地选择将源放置在何处。那就是您发挥技能的地方。

任务

您将获得一个输入,该输入由一个字符串表示,该字符串表示带有房间和水箱的房间:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

您必须确定水是否最终到达水箱。如果可能,水向下流动,如果可能,则向左和向右流动。水不会积聚,因为它不会上升。

因此,对于上述输入,结果为:

#######
#  *  #
#  *  #
#*****#
#*###*#
#**O**#
#######

水很高兴地到达水箱,因此您必须输出真实值。

但是,如果水没有到达水箱:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#*    #
#*    #
#* X  #
#*### #
#*****#
#######

然后,您必须输出一个伪造的值。

编写一个程序来确定水是否最终到达水箱。您的代码应尽可能短。

假设条件

  • 假定输入始终有效(整个房间是带有S和E的封闭矩形区域)。

  • 假设仅提供一个房间作为输入。

测试用例

您的程序应为以下测试用例返回真实值:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

#######
#  S  #
#     #
#  E  #
#     #
#     #
#######

#######
#     #
#     #
# SE  #
# ### #
#     #
#######

###############################################
#                      S                      #
#                                             #
#                                             #
#                                             #
#               ###############               #
#                                             #
#  ##################     ##################  #
#                                             #
#                                             #
#                    #####                    #
#                      E                      #
###############################################

#######
#  S  #
#     #
#     #
# ### #
#   # #
### ###
## E ##
#     #
#######

但是对于以下测试用例来说,这个值是虚假的:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#     #
# SE  #
#     #
#     #
#     #
#######

#######
#     #
#  E  #
#     #
#  S  #
#     #
#######

####################################
#                                  #
#                                  #
#                                  #
#S             #                  E#
####################################

第二要在真正的类别最后一个房间和最后一个房间的假类是无耻地被盗,从借来的跳和跑:KOTH马努(谁删除的沙箱后)。

真实类别中的最后一个房间来自Martin Buttner在《视网膜》中的回答


注意:我删除了KOTH沙箱帖子,您的挑战看起来更好了:)
CommonGuy

直到水填满房间才积水吗?因此,当且仅当它们在同一房间内时,水始终会到达水箱。
鲍勃

1
在对/错挑战(或几类的分类挑战)中格式化测试用例的专业技巧:按输出对测试用例进行分组并分离组,这样您就可以避免使用from / to/ really位(这使参与者更容易处理所有测试一次)。
Martin Ender

1
所以基本上我的世界的液体流动逻辑。尽管在Minecraft中,我认为您的真实测试用例中的第3个将返回false,因为水只会流向左侧。
帕特里克·罗伯茨

1
让我想起了流沙物理。
user253751 '16

Answers:


15

蜗牛,20字节

\S{d(=\#n)?^#},!(t\E

打印0虚假值和1真实值。

在线尝试!

  • \SS开始比赛
  • d 设定方向向下
  • {...}, 匹配大括号中的内容0次或更多次
  • =\#是一个断言,如果#蜗牛前面有一个字符,则该断言成功,但不会移动它
  • n 沿任一方向旋转90度
  • (...)? 匹配括号中的模式0或1次
  • \ ​ 匹配一个空间并将蜗牛移动到该空间
  • !(... 是一个否定的断言
  • t 传送到网格中任何不匹配的正方形
  • \E 火柴 E

我不想自己编译这种语言。有在线翻译吗?
user48538 '16

@ zyabin101不,没有在线翻译。
feersum '16

好吧,该打电话给丹尼斯了。:P我的投影仪在哪里?
user48538 '16


好吧,我已经尝试过了,但是它为所有测试用例打印了0,但为我打印了一个。我究竟做错了什么?
丹尼斯

11

滑动 20 + 2 = 22字节

S>( ^4|^4(?|`#)^T)*E

因此,Slip仍然像以往一样破碎,但这一次确实是一个挑战。它从来没有真正设计过像高尔夫球一样的东西,所以它永远不会在任何情况下击败Snails:P

需要r标志(无重复单元)终止。

在线尝试。输出是真实的路径,虚假的路径为空。

S                 Match S
>                 Rotate pointer downward
(                 Either...
 <space>^4          Match a space and point downwards
 |                  or
 ^4                 Point downwards
 (?|`#)             Match # below then reset pointer
 ^T                 Either turn left or right
)*                ... 0+ times
E                 Match E

6

视网膜,87字节

字节数假定为ISO 8859-1编码。

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?
M`E
0

在线尝试!

在Retina(或一般.NET regex)中可能进行2D字符串处理,但并不十分简洁。

说明

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

这是一个洪水填充,用标记所有被水到达的单元S。通过匹配可到达的字符,然后S使用T-mode 将其音译为字符来实现。洪水将同时通过和穿过E。在+开头重复,直到输出停止变化。

至于实际的正则表达式则包含两种单独的情况:

(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]

这与一个空格匹配,或者E恰好是下方的一个单元格S。垂直匹配通过使用平衡组对当前行上的前缀进行计数来完成,因此我们可以确保水平位置相同。这一个照顾下降的水。

.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

这是非常相似的:它与an匹配,S并且如果可能,则匹配该字符之前和之后的字符,前提是该字符正下方的字符S#。这样可以照顾到水在地面上的散布。

完成后,很容易确定水是否到了E。如果是这样,则E已从泛洪填充中的字符串中删除了该字符串,如果不是,E则该字符串仍然存在。因此,让我们计算Es 的数量:

M`E

但是现在0对于真实的测试用例来说1(我认为是虚假的),对于虚假的测试用例来说就是(我认为是虚假的)。通过计算0此结果中的s 数,我们可以很容易地将其反转:

0

做完了


将您的输入添加为测试用例。
user48538 '16
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.