실패하는 성을 감지


40

중력의 흥미로운 측면 중 하나는 내가 아는 한, 공중에 떠 다니는 물건을 가질 수 없다는 것입니다.

그러나 무작위 성 건축업자 협회의 모든 사람들 이이 사실을 알고있는 것은 아니며 다음과 같은 성으로 이어집니다.

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

그리고 이것:

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

그리고 이것조차도 :

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

도전

유효한 성의 경우 모든 블록이 직간접 적으로지면에 연결됩니다. 귀하의 프로그램 또는 기능 에는 위와 같은 성이 입력으로 제공되며 , 성의 유효성 여부를 반영 하여 진실하거나 허위 가치를 반환해야합니다 .

규칙

  • 입력은 문자열로 제공됩니다.
  • 모든 유효한 성은 표면에 놓여 ````````있습니다. (입력 문자열 에 지표면이 포함 되지 않은 경우 성은 유효하지 않습니다.)
  • 모든 입력이 다음 기준을 충족한다고 가정 할 수 있습니다.
    • 표면은 항상 평평합니다.
    • 표면은 항상 성만큼 넓을 것이므로지면의 왼쪽이나 오른쪽에 블록이 없습니다.
    • 입력은 절대 #표면 아래에 있지 않습니다 .
    • 입력에는이 챌린지에 지정된 문자 만 포함됩니다. ( #,, `공백 또는 줄 바꿈)
    • 입력에 항상 하나 이상의 문자가 포함되어 있다고 가정 할 수 있습니다.
  • 블록이 수평 또는 수직으로 인접한 경우 연결됩니다. 대각선은 포함되지 않습니다!
    • 연결됨 :
      #	or	##
      #
    • 연결되지 않은:
      #      or	# #	or	 #
      #
      #
  • 성이 유효해야합니다. 다시 말해, 입력이없는 입력 #은 잘못된 값을 제공해야합니다.
  • 입력에는이 챌린지에 지정된 문자 만 포함됩니다. ( #,, `공백 또는 줄 바꿈)
  • 입력에 항상 하나 이상의 문자가 포함되어 있다고 가정 할 수 있습니다.
  • 표준 I / O허점 규칙이 적용됩니다.

테스트 사례

거짓

  • 위에 주어진 모든 예.
  • # # # # 
    #### ####
    #### ## ####
    ##############
    ###### ######
    ## ### #####
    (땅 없어요)
  • # 
    #######
    #### # # ####
    ############
    ###### ######
    ##### # # ####
    ``````````````
    (맨 위 블록은 가로 나 세로로 연결되어 있지 않습니다.)
  •    
    ```
    (성 없음)


  • # # # # #
    ##############
    ##### ## #####
    # # # # # # # # #### # # # #### # # # # # # # #
    #### #### #### #### ## #### ## #### #### #### ####
    ## ## ## # ##### # # #### # # #### # # #### # # #### # # ##### # # #### # # ####
    ################################################ ###############################
    ############## ## ##### ######## # ####### ############## ####### ##### ##
    ############################# ######## #############################
    ################################ ##### ############ ########################
    `````````````````````````` ```````````````````````````````````````````````````` ``````````````
    (중앙 타워는 가로 또는 세로로 연결된 블록이 없기 때문에 성의 나머지 부분과 연결되어 있지 않습니다.)
  •    
    (성 없음)

  • (성 없음, 단 하나의 개행 문자)
  • # # 
    #
    ```````
    (가장 오른쪽 블록은 가로 또는 세로로 연결되어 있지 않습니다.)
  •    
    ```
    (성 없음)

Truthy

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

행운을 빕니다!


입력의 모든 줄이 같은 길이 (예 : 공백으로 채워짐)라고 가정 할 수 있습니까?
smls

@smls 아니요, 입력이 채워질 것이라고 가정 할 수 없습니다.
user2428118

1
@smls Re # 1 and # 2 : 실제로는 제출물이 처리 할 필요가 없도록 지정하려고했지만 이제는이를 기록한 방식이 아닙니다. 아직 이러한 사항을 처리하는 솔루션이 게시되어 있지 않으므로 질문을 업데이트하여 처리 할 필요가 없는지 확인합니다. 다시 # 3 : 코드가 Falsy 테스트 사례 2, 4 및 6을 올바르게 처리 하지만지면에 연결된 블록이없는 상황을 감지하지 못하는 상황을 실제로 생각할 수 없습니다 . Re # 4 : 그 말의 의미를 잘 모르겠습니다. Truthy 테스트 사례 1에서 이미 처리되지 않았 습니까?
user2428118


2
바나나 캐슬? 최고의 성
매튜 노

답변:


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의 답변에 성으로 게시 한 예를 인식하지 못합니다. 나는 이것들 성으로 감지 되어서는 안된다고 말하는 규칙에 아무것도 보이지 않습니까? 규칙은 단지 각각 #이 지상에 연결되어 있으면 성이라고 말합니다 .
Martin Ender

@Zgarb 아니요, 설명에 버그 +가 있습니다. 실제로는 0이 아니라 1 회 이상입니다. 연결이 끊긴 성을 허용 한 후에는 어쨌든 다르게 보일 것입니다.
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

Grime , 29 바이트

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

온라인으로 사용해보십시오! 대부분의 테스트 사례는 TIO에서 시간 초과됩니다. 바꾸기 <0C><0CoF>조금 더 빨리 만들 수 있습니다.

설명

나는 모든 #곳에서 경로 `가 있고 적어도 하나가 있는지 확인하고 #있습니다. 최근 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

자바 스크립트 (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리터럴 개행 문자를 나타냅니다. 에 #인접한 것을 찾아서로 `변경 하여 한 번에 하나씩 모든을 제거하려고 합니다 `. 원래 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

펄 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}

입력에 하나 이상이 포함되어 #있는지, 그리고 모두 #가에 대한 경로를 찾을 수 있는지 확인합니다 `.

경로 찾기는 항상 #동일한 연결된 영역의 다른 모든 영역을 방문하는 (즉, 단락되지 않는) 재귀 함수를 사용하여 무차별 화되기 때문에 비효율적 입니다.

Junction 연산자와 slipping 간의 부정한 상호 작용을 사용 하여 경로 찾기 기능 외부를 별도로 검사하지 않고도 공백 문자에 대한 경로 테스트를 건너 뜁니다.


5

파이썬 3 , 214206 바이트

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)을 사용하면 목록의 사전 식 순서 만 증가시킬 수 있습니다.)

#이 남아 있지 않고 처음에 하나 이상이 존재하면 성은 유효합니다.

  • 설정된 차이가 아닌 #을 검사하는 8 바이트를 절약했습니다. '#'in s and'#'not in C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.