여기서 살 수 있습니까?


16

Terraria 게임 에서 게임 역학 중 하나는 NPC가 입주 할 수 있도록 집을 짓는 것과 관련이 있습니다. 유효한 집으로 간주되는 것에 대한 엄격한 규칙이 있습니다. 다음은 규칙 목록입니다.

  1. 집안의 총 면적은 60 정사각형 타일 이상이어야하지만 750 미만이어야합니다. 또한 외부 프레임을 포함한 집의 크기는 다음 중 하나 이상이어야합니다.

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

    간단하게하기 위해 다음과 같이 가정 할 수 있습니다. a) 모든 입력 집은 사각형이며 b) #집 안에는 단단한 타일 이 없습니다 . 다음은 12x6 프레임입니다 (아름다운 ASCII로 그려 짐).

    ############
    #          #
    #          #
    #          #
    #          #
    ############
    
  2. 집은 배경 벽으로 덮여 있어야합니다. 이들은 단단한 타일이 아니라 3 차원에서 집 뒤에 있는 벽 입니다. 구멍은 허용되지만 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 개 이상의 공백을 포함하지 않는 테스트 사례를 사용할 수 있습니다.
Martin Ender

불분명 한 점이 많이 있습니다. 1. 프레임이 직사각형이어야합니까? " 모든 집은 직사각형이 될 것이다 "는 제안하지만 직사각형이 아닌 프레임을 명확하게 배제하지는 않지만 축 정렬 경계 상자의 네 구석으로 들어갑니다. 그리고 아마도 구멍으로 둘러싸 일 수 있습니다 #. 2. Martin이 요청한 것처럼 " 구멍이 4x4보다 클 수 없음 "은 정확히 무엇을 의미합니까? (또한 세 번째를 읽을 때까지 나는 그 구멍이 무엇인지 확실히 확신하지 못했습니다. 게임을하지 않은 사람들을 위해 사양을 작성해야합니다).
피터 테일러

1
3. " 이 단단한 블록은 벽에 직접 인접 할 수 없습니다 "-벽이란 무엇입니까? 지점 2부터는 ~처럼 보이지만 *유효한 문의 주어진 예는 제외됩니다. 4. " 지상 "은 "최후 행"또는 "위 #"를 의미합니까? 5. " 테이블과 의자에는 적용되지 않습니다. "그렇다면 바로 아래에 T또는 그 C아래에 있는 4x4 구멍 이 너무 큽니까? 6. " 입구가 유일한 코너에 있기 때문에 NPC에 입장 할 수 없습니다 ." 스펙이 코너에 대해 아무 말도하지 않았다고 생각합니다. 그들이 -있거나 |다른 문이있을 수 있습니까?
피터 테일러

7. 구석에있는 출입구가 출입을 허용하지 않아 문제가되는 경우, 출입구에서 출입 *할 수 있어야합니까? 또는 *구멍의 중간에 격리 되어 있고, 한쪽 면만 출입구가있는 구멍으로 출입 할 수있는 구멍과 구멍으로 직접 들어가는 출입구를 두 개로 자르는 구멍이 있습니까?
피터 테일러

답변:


2

파이썬 2, 503 439 바이트

매우 짧지는 않지만 해결책입니다. 골프에 대한 정보가 있으면 알려주세요. 실제로 읽을 수 없기 때문에 ungolfed 버전도 확인하는 것이 좋습니다.

편집 : 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

Ungolfed 버전 온라인

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.