我可以住在这里吗?


16

Terraria游戏中,游戏机制之一是建造房屋,以便NPC可以进入。有一套严格的规则来确定什么是有效房屋。以下是规则列表:

  1. 房屋的总面积必须至少为60平方米,但少于750平方米。此外,房屋的尺寸(包括外框)必须至少为以下尺寸之一:

    5x12
    6x10
    7x9
    8x8
    9x7
    10x6
    12x5
    15x4
    

    为简单起见,您可以放心地假设:a)所有输入房屋将为矩形,并且b)房屋内将没有实心砖#。这是我们的12x6帧(以漂亮的ASCII绘制):

    ############
    #          #
    #          #
    #          #
    #          #
    ############
    
  2. 房子必须被背景墙覆盖。这些不是实心砖,而是三维空间中房子后面的墙。允许有孔,但任何孔都不能大于4x4。如果一行或一列中有5个或更多的空格字符,则该孔大于4x4,并且该房屋无效。也可以有多个孔,但必须至少有一个壁。

    ############
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
    ############
    #*    *    #
    #*    *    #
    #*    *    #
    #******    #
    ############  (Still acceptable since neither hole is larger than 4x4 and there is a separator)
    
    ############
    #    ******#
    #***    ***#
    #    ******#
    #***    ***#
    ############  (Also still valid. No row or column of blank spaces is longer or taller than 4.)
    
  3. 必须有一个入口。这可以是|侧面的门,也可以是-地板或天花板上的平台。如果唯一的入口在拐角处,则NPC无法进入。另外,如果您有一个平台作为地板,则必须至少有一个单独的实体块才能使NPC站立。该实体块不能直接邻近左侧或右侧的侧壁。这些都是带入口的有效房屋:

    ############
    #**********#
    |**********#
    #**********#
    #**********|
    ############  (Multiple doors, or doors up high are okay)
    
    ############
    #**********#
    #**********#
    #**********#
    #**********#
    #######----#
    
    #----#######
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
  4. 必须至少有一个光源$,桌子T和椅子C,但允许更多。光源可以在空中或在地面上,但是桌子和椅子都必须在地面上,例如在最下面的一排。

    ############
    #**********#
    #**********#
    #***$******|
    #****TC****|
    ############
    

    另外,您可以假设任何家具后面都有墙,因此手电筒,椅子或桌子可以视为两个孔之间的分隔物。

    ############
    #*    *    #
    #*    *    #
    #*    $    #
    #**TC******|
    ############
    

挑战

您必须编写最短的函数,该函数将房屋作为ASCII字符串,并返回true / false(无论它是否为有效房屋)。您可以将其作为换行符分隔的字符串,字符串列表或任何其他方式(只要合理)。为了我的缘故,请包括一个简短的程序,以便我可以测试它是否正确运行。

作为参考,这些都是无效的输入:

############
-**********#
-****$*****#
-**********#
-******TC**#
############  (You can't have platforms on the sidewalls)

###########-
#**********#
#**********#
#****$*****#
#**T***C***#
###########|  (NPC can't enter because the only entrances are on the corner)

############
#**********#
#******$***#
#**********#
#T****C****#
##--------##  (NPC has nowhere to stand)

############
#**********#
#**********#
#**********#
#**$**TC***#
##########|#  (Door cannot be in the floor or ceiling)

############
#**********#
#**********#
#**********#
|**   T C  #
############  (Since table and chair do not count as a background wall, the hole in background is too wide)

####### ####
#**********#
#**********#
#****$*****#
#**T***C***|
############  (There's a hole in the frame.)


###########################################################################
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
###########################################################################  (House is 75x11, which is too big.)

排行榜


6
很酷的挑战,Terraria的爱人。
Rɪᴋᴇʀ

我们可以假设孔是矩形的吗?否则,这可能会使用一个测试用例,其中整体不适合4x4,但不能连续包含超过4个空格。
马丁·恩德

我发现许多要点不清楚。1.框架必须是矩形的吗?“ 所有房屋都将是矩形 ”表明它们确实是矩形,但并未明确排除非矩形但进入其轴对齐边界框的所有四个角的框架。而且可能会被包围#。2.正如马丁所问,“ 没有孔可以大于4x4 ”是什么意思?(还请注意,直到我的第3遍通读本,我才确定了解漏洞是什么。您应该为未玩过游戏的人编写规范。)
彼得·泰勒

1
3.“ 此实体块不能直接与墙壁相邻 ”-什么是墙壁?从第2点来看,似乎是*,但这将排除给定有效门示例。4.“ 在地面上 ”是指“倒数第二排”还是“上方#”?5.“ 这不适用于桌子和椅子。 ”这是否意味着4x4的孔在其正下方TC正上方太大?6.“ NPC无法进入,因为只有入口在拐角处 ”我不认为规范对拐角处有任何规定。可能是-|如果还有其他门?
彼得·泰勒

7.如果拐角处的入口由于不允许进入而成为问题,这是否意味着每个*入口都必须可从入口到达?还是*在孔的中间隔离开来,将整个房间一分为二的孔,仅一侧允许入口,而直接进入孔的入口被隔离?
彼得·泰勒

Answers:


2

Python 2中,503个 439字节

不是很短,但这是一个解决方案。让我知道您是否喜欢打高尔夫球。我建议也查看我的非高尔夫版本,因为它实际上是可读的。

编辑:if循环外的所有s已在底部合并。

def f(s):
 s=s.split("\n");e=l=0;h=len(s);w=len(s[0])
 for c in s[0][1:-1]+s[-1][1:-1]:
    if(c in"#-")<1:return 0
    if"-"==c:e=1
 for r in s[1:-1]:
    if(r[0]in"#|")*(r[-1]in"#|")<1or" "*5in r:return 0
    if"$"in r:l=1
 for r in zip(*s):
    if" "*5in`r`[2::5]:return 0
 if(h*w<60)+(h*w>749)+(w<5)+(h<4)or" "in s[0][0]+s[0][-1]+s[-1][0]+s[-1][-1]or("T"in s[-2])*("C"in s[-2])*l<1or("#"in s[-1][2:-2])<1or"|"in"".join(s[1:-1])<1>e:return 0
 return 1

在线尝试

取消高尔夫:

还输出结果为的原因False,以用于调试目的。

def f(s):

    # check dimensions
    s=s.split("\n")
    h=len(s)
    w=len(s[0])
    if h*w < 60 or h*w > 749 or w<5 or h<4: return False,"Size"

    # top / bottom
    e=0
    for c in s[0][1:-1]+s[-1][1:-1]:
        if(c in"#-")<1:return False,"T/B"

        # entrance
        if"-"==c:e=1

    # no spaces in corners -_-
    if" "in s[0][0]+s[0][-1]+s[-1][0]+s[-1][-1]: return False,"Corner"

    # light, table, chair
    l=t=c=0

    # left / right
    for r in s[1:-1]:
        if(r[0]in"#|")*(r[-1]in"#|")<1: return False,"L/R"

        # walls, put above
        if" "*5in r: return False,"Walls"

        # light
        if"$"in r:l=1

    # table, chair
    if"T"in s[-2]:t=1
    if"C"in s[-2]:c=1

    if l*t*c<1: return False,"L/T/C"

    # wall columns
    for r in zip(*s): # Transpose
        if" "*5in`r`[2::5]: # Tuple to string
            return False,"Walls"

    # entrance
    if"|"in"".join(s[1:-1])<1>e: return False,"Entrance"

    # place to stand
    if("#"in s[-1][2:-2])<1: return False,"Stand"

    return True

在线版本

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.