检测失败的城堡


40

据我所知,引力的有趣方面之一是,您不能只让物体漂浮在空中。

但是,似乎并不是每个城堡建设者协会的人都知道这一事实,导致了像这样的城堡的出现:

                      #
                      #
    #  #      #  #   ###
    ####      ####   # #
    #### #  # ####   ###
    ##############   ###
    ######  ######   ###
    #####    #####   ###
                     ###
``````````````````````````````

还有这个:

                                       # # #    # # #   
                                       ##############
                                       ###  ####  ###
    #  #      #  #      #  #      #  # ###  ####  ### #  #      #  #      #  #      #  #
    ####      ####      ####      #### ############## ####      ####      ####      ####
    #### #  # #### #  # #### #  # #### ## ######## ## #### #  # #### #  # #### #  # ####
    ####################################################################################
    ######  ########  ########  ########  ########  ########  ########  ########  ######
    ###################################    ######    ###################################
    ###################################    ######    ###################################
                                       ##
                                         ##
                                           ##
                                             ##
                                               ##
````````````````````````````````````````````````````````````````````````````````````````````

甚至这个:

       ##########
   ####   #      ###
#######################
            #
              #
                #
                  #
                    #  # # #
                  #   #  ###
                   #   # ###
                # # #  #  ##
                # # ##   ###
                 #  #  #####
                   #   #####
                  # #  #####
                       #####
                       ## ##
                       #####
                       #####
                       ## ##
                       ## ##
````````````````````````````````````````````

挑战

对于有效的城堡,所有街区都将直接或间接连接到地面。您的程序或函数将获得一个城堡(例如上面的城堡)作为输入,并且您的程序必须返回一个真实或错误的值,以反映城堡是否有效。

规则

  • 输入以字符串形式给出。
  • 所有有效的城堡都位于地面上````````。(如果输入字符串并含有表面,城堡是无效的。)
  • 您可以假设所有输入都将满足以下条件:
    • 表面将始终是平坦的。
    • 该表面的宽度始终至少应与城堡一样宽,因此地面的左侧或右侧将不会有障碍物。
    • 输入永远不会#低于表面。
    • 输入内容将仅包含此挑战中给定的字符。(#,,`空格或换行符。)
    • 您可以假设输入将始终包含至少一个字符。
  • 如果块在水平或垂直方向上相邻,则将它们连接起来。对角线不算!
    • 连接的:
      #	or	##
      #
    • 未连接:
      #      or	# #	or	 #
      #
      #
  • 城堡必须存在才能有效。(换句话说,没有任何输入的输入#必须给出虚假的值。)
  • 输入内容将仅包含此挑战中给定的字符。(#,,`空格或换行符。)
  • 您可以假设输入将始终包含至少一个字符。
  • 标准I / O漏洞规则适用。

测试用例

虚假

  • 上面给出的所有示例。
  • ## ## 
    #### ####
    #### ## ####
    ##############
    ###### ######
    ## ### #####
    (没有地面。)

  • ### ####
    #### ## ####
    ##############
    ###### ######
    ###### ####
    ````````````
    (最上面的块未水平或垂直连接。)
  •    
    ```
    (没有城堡。)


  • ######
    ##############
    ##### ## #####
    ## ## ## ## #### ## #### ## ## ## ##
    #### #### #### #### ## #### ## #### #### #### ####
    ## ###############################################
    ################################################ ##################################
    ###### ######## ## ###### ####### ######## ######## ############## #### ##
    ################################# ######## ###########################
    ############################################# ###########################
    `````````````````````` `````````````````````````````````````````````````` ````````````
    (中央塔楼未连接到城堡的其余部分,因为没有水平或垂直相邻的块将其连接。)
  •    
    (没有城堡。)

  • (没有城堡,只有一个换行符。)
  • ## 

    ```````
    (最右边的块未水平或垂直连接。)
  •    
    ```
    (没有城堡。)

特鲁西


  • `
  • ## ## 
    #### ####
    #### ## ####
    ##############
    ###### ######
    ## ### #####
    ````````````


  • #### ###
    #### #### ##
    #### ## #### ###
    ############## ###
    # ##### ######
    ####### ##### ###
    ##### ##### ###
    ```````` ``````````````````
  •                                        ######    
    ##############
    ### #### ###
    ### ## ### ### #### ### ## ## ## ##
    #### #### #### #### #### ############## #### #### ## ##
    ############################################ ## ## ####
    ########################################## ##########################################
    ###### ## ###### ####### ######## ######## ############## #### #### ######
    ################################ ##### ###################################
    ############################################# ##########################
    ````''`````````````` `````````````````````````````````````````````````` ````````````````
  •                       #### ### 
    ##### ###
    ####
    ###

    ###
    #####
    #######
    #########
    ### ## #####
    ##### #####
    ###### ######
    #################
    #### ###########
    #############
    #############
    #############
    ###### ######
    ##### ######
    #############
    #############
    #############
    #############
    ###### ##### #
    ###### ######
    #############
    #############
    ########### ##
    ##################
    ######
    ###### ######
    ############ ##
    #############
    #############
    #############
    ######### ####
    ##### #####
    ##### #####
    ##### #####
    `````````````` `````
  •                                                 
    ####
    #####
    ######
    ####
    ####
    #####
    ########
    ##########
    #### ######
    ###########
    ############
    ##############
    ##### ## ##############
    ########### #################
    ###########################################
    ####### #################################
    ################# ####################
    ############################## ####
    ############################
    ################## #
    ``````````````````````````````````````````````` `

祝好运!


我们是否可以假设输入的所有行都具有相同的长度(即,用空格填充)?
smls '02

@smls不,您不能假设输入将被填充。
user2428118 '17

1
@smls关于#1和#2:我实际上是要指定提交的内容不必处理,但是我现在看到的不是我写下来的方式。由于尚未发布解决这些问题的解决方案,因此我将更新问题,以便您显然不必解决这些问题。关于#3:我真的无法想到这样一种情况,代码可以正确处理Falsy测试用例2、4和6,但却无法检测到根本没有任何块连接到地面的情况。关于#4:我不确定您的意思。Truthy 1号测试案例是否已经解决了这个问题?
user2428118 '17


2
香蕉城堡?最好的城堡
马修·鲁

Answers:


11

蜗牛21 18字节

-3个字节,因为附加的输入约束已被编辑为质询。

!{t=\#!(\#o`+\`}\#

不幸的是,时间复杂度是阶乘,因此大多数输入都不可运行。

对于虚假案例,输出0;对于虚假案例,输出数量#

                 ,,
!{ t             ,, Assert that nowhere in the grid,
    =\#          ,, there is a '#'
    !(           ,, such that there does not exist
        (\# o)+  ,, an orthogonally connected path of '#'
        \`       ,, ending at a '`'
    )            ,,
}                ,,
\#               ,, Match '#' at starting position

这无法识别您在Zgarb的答案中张贴的城堡示例。我在规则中看不到任何内容,这些内容不应被视为城堡?规则只说如果每个#都接地,那就是一座城堡。
马丁·恩德

@Zgarb不,原因是有一个错误- +实际上是1次或多次,而不是0次。在允许断开城堡连接后,它看起来还是会有所不同。
feersum

9

八度, 53 51字节

@(s)([~,n]=bwlabel(s>32,4))|n==1&&nnz(diff(+s)==61)

在线尝试!

*由于op删除了检查空输入答案的要求,因此恢复为我的首次编辑。

说明:

nnz(s)                       check for empty input
([~,n]=bwlabel(s~=' ',4))    label nonempty regions and count number of labels

n==1                         check if number of labels is 1.

nnz(diff(+s)==61)            check if blocks connected to the surface

6

污垢,29个字节

C=\`|\#&<0C>oX
e`\#&C!v#!&\##

在线尝试! 大多数测试用例在TIO上超时。更换<0C><0CoF>让它更快一点。

说明

我正在检查是否#存在通往a的路径`,并且至少存在一个#。我最近向Grime添加了旋转命令,这使这项挑战变得更加容易。

C=\`|\#&<0C>oX  First line:
C=               Define nonterminal C as
  \`             the literal `
    |            or
     \#          the literal #
       &<  >     which is contained in a larger rectangle
         0C      containing said literal adjacent to a match of C
            oX   rotated by any multiple of 90 degrees.
e`\#&C!v#!&\##  Second line:
e`               Match entire input against this pattern:
         !       does not
       v#        contain
  \#             the literal #
    &C!          which is not a match of C,
          &      and
             #   contains
           \#    the literal #.

6

JavaScript(ES6),197 196字节

f=(s,l=Math.max(...s.split`\n`.map(t=>t.length)),t=s.replace(/^.*/g,t=>t+' '.repeat(l-t.length)),u=t.replace(eval('/(#|`)([^]{'+l+'})?(?!\\1)[#`]/g'),'`$2`'))=>t==u?/#/.test(s)>/#/.test(t):f(s,l,u)

其中\n代表文字换行符。尝试一次删除所有#s,方法是找到与a相邻的一个`并将其更改为a `。返回true如果有至少一个是#最初但被全部去除。需要填充118 117字节的输入的版本:

f=(s,t=s,u=t.replace(eval('/(#|`)([^]{'+s.search`\n`+'})?(?!\\1)[#`]/'),'`$2`'))=>t==u?/#/.test(s)>/#/.test(t):f(s,u)

5

Perl 6,180字节

{?/\#/&&?all map ->\c{my \b=[map {[$^a.comb]},.lines];sub f(\y,\x){with b[y;x] ->$_ {b[y;x]=0;/\#/??f(y+(1|-1),x)|f(y,x+(1|-1))!!/\`/??1!!|()}}(|c)},map {|($++X ^$^a.comb)},.lines}

检查输入是否至少包含一个#,以及每个输入是否#都能找到的路径`

效率较低,因为寻路是使用递归函数强制执行的,该函数始终会访问#同一连接区域的所有其他对象(即不会短路)。

使用之间的一些相互作用邪恶运营商和滑动,以确保该路径测试被跳过对于空格字符而不需要用于寻路功能的该外部的单独的检查。


5

Python 3中214个 206字节

def f(s):
 C=s.split('\n');n=max(map(len,C));o=[''];C=[*''.join(t.ljust(n)for t in C+o)]
 while C>o:o=C;C=['`'if z>' 'and'`'in{C[i+y]for y in(1,-1,n,-n)}else z for i,z in enumerate(C)]
 return'#'in{*s}-{*C}

在线尝试!

这里的第一行致力于将所有行填充到相同的长度:我们分割字符串(s.split('\n')比短一个字符s.splitlines()),找到一行的最大长度,并在填充每个字符后将所有字符的拼合列表分配给C线。(换行符不见了。)

然后我们创建一个列表,其中至少一个反引号附近的每个非空格字符都被反引号代替,并继续操作直到没有变化为止(当旧列表o等于时C。我们可以进行比较,C>o而不是C!=o因为替换#(ASCII 35 )与`(ASCII 96)只能增加列表的字典顺序。

如果没有#号,并且最初至少有一个#,则该城堡有效。

  • 保存八个字节以检查设置差异中的#,而不是 '#'in s and'#'not in C
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.