Phát hiện lâu đài không thành công


40

Một trong những khía cạnh thú vị của lực hấp dẫn là, theo như tôi biết, bạn không thể có những thứ trôi nổi giữa không trung.

Tuy nhiên, dường như không phải ai trong Hiệp hội các nhà xây dựng lâu đài ngẫu nhiên cũng biết về thực tế này, dẫn đến các lâu đài như thế này:

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

và cái này nữa:

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

và thậm chí cái này:

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

Thử thách

Đối với một lâu đài hợp lệ, tất cả các khối sẽ được kết nối với mặt đất trực tiếp hoặc gián tiếp. Bạn chương trình hoặc chức năng sẽ được cung cấp một lâu đài như những người ở trên như là đầu vào, và chương trình của bạn phải trả lại một truthy hoặc giá trị falsy phản ánh dù lâu đài là hợp lệ hay không.

Quy tắc

  • Đầu vào được đưa ra dưới dạng một chuỗi.
  • Tất cả các lâu đài hợp lệ nằm trên một bề mặt ````````,. (Nếu chuỗi đầu vào không chứa bề mặt, lâu đài không hợp lệ.)
  • Bạn có thể giả sử tất cả các đầu vào sẽ đáp ứng các tiêu chí sau:
    • Bề mặt sẽ luôn phẳng.
    • Bề mặt sẽ luôn luôn rộng ít nhất là rộng như lâu đài, vì vậy sẽ không có khối bên trái hoặc bên phải của mặt đất.
    • Đầu vào sẽ không bao giờ có #dưới bề mặt.
    • Đầu vào sẽ chỉ chứa các ký tự được đưa ra trong thử thách này. ( #, `không gian hoặc dòng mới.)
    • Bạn có thể cho rằng đầu vào sẽ luôn chứa ít nhất một ký tự.
  • Các khối được kết nối nếu chúng nằm ngang hoặc dọc. Đường chéo không được tính!
    • Đã kết nối:
      #	or	##
      #
    • Không kết nối:
      #      or	# #	or	 #
      #
      #
  • Lâu đài phải tồn tại để có giá trị. (Nói cách khác, đầu vào mà không có bất kỳ #giá trị giả nào.)
  • Đầu vào sẽ chỉ chứa các ký tự được đưa ra trong thử thách này. ( #, `không gian hoặc dòng mới.)
  • Bạn có thể cho rằng đầu vào sẽ luôn chứa ít nhất một ký tự.
  • Áp dụng quy tắc I / Okẽ hở tiêu chuẩn .

Các trường hợp thử nghiệm

Giả

  • Tất cả các ví dụ nêu trên.
  • # # # # 
    #### ####
    #### # # ####
    ##############
    ###### ######
    ## ### #####
    (Không có căn cứ.)
  • # 
    ### ####
    #### # # ####
    ###############
    ###### ######
    ##### # ####
    `` `` `` `` `` `` ``
    (Khối trên cùng không được kết nối theo chiều ngang hoặc chiều dọc.)
  •    
    `` `
    (Không có lâu đài.)


  • # # # # # #
    ##############
    ##### ## #####
    # # # # # # # # #### # # #### # # # # # # # #
    #### #### #### #### ## #### ## #### #### #### ####
    ## ## # # #### # # #### # # #### # # #### # # #### # # #### # # #### # # ####
    ###################################################### ####################################
    ###### ########### ###### ######## ######## ######## ######## ######## #### ##
    ##################################### ###### ######## ##############################
    ##################################### ###### ########## ##########################
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``
    (Tháp trung tâm không được kết nối với phần còn lại của lâu đài vì không có các khối liền kề theo chiều ngang hoặc chiều dọc kết nối với nó.)
  •    
    (Không có lâu đài.)

  • (Không có lâu đài, chỉ là một nhân vật mới.)
  • # # 
    #
    `` `` `` `
    (Khối ngoài cùng bên phải không được kết nối theo chiều ngang hoặc chiều dọc.)
  •    
    `` `
    (Không có lâu đài.)

Sự thật

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

Chúc may mắn!


Chúng ta có thể giả sử tất cả các dòng của đầu vào sẽ có cùng độ dài (nghĩa là lấp đầy khoảng trắng) không?
smls

@smls Không, bạn không thể cho rằng đầu vào sẽ được đệm.
dùng2428118

1
@smls Re # 1 và # 2: Tôi thực sự muốn xác định rằng các bài nộp không phải xử lý điều đó, nhưng bây giờ tôi thấy đó không phải là cách tôi viết nó xuống. Vì chưa có giải pháp nào được đăng tải để xử lý những điều này, tôi sẽ cập nhật câu hỏi để rõ ràng bạn không phải xử lý những vấn đề này. Re # 3: Tôi thực sự không thể nghĩ đến một tình huống trong đó mã sẽ xử lý chính xác trường hợp kiểm tra Falsy 2, 4 và 6 và không phát hiện ra tình huống trong đó không có khối nào được kết nối với mặt đất. Re # 4: Tôi không chắc ý của bạn là gì. Không phải điều đó đã được xử lý bởi trường hợp thử nghiệm Truthy số 1 ​​sao?
dùng2428118


2
Một lâu đài chuối? CASTLE EVER TỐT NHẤT
Matthew Roh

Câu trả lời:


11

Ốc , 21 18 byte

-3 byte do các ràng buộc đầu vào bổ sung được chỉnh sửa thành thách thức.

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

Thật không may, độ phức tạp thời gian là yếu tố, vì vậy hầu hết các yếu tố đầu vào không thể chạy được.

Kết quả 0 cho các trường hợp giả và số lượng #cho các trường hợp trung thực.

                 ,,
!{ 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

Điều này không nhận ra ví dụ bạn đã đăng trên câu trả lời của Zgarb là một lâu đài. Tôi không thấy bất cứ điều gì trong các quy tắc nói rằng những thứ này không nên được phát hiện là lâu đài? Các quy tắc chỉ nói rằng đó là một lâu đài nếu mỗi cái #được kết nối với mặt đất.
Martin Ender

@Zgarb Không, có một lỗi trong lời giải thích - +thực tế là 1 lần trở lên, không phải 0. dù sao nó cũng sẽ khác đi sau khi cho phép các lâu đài bị ngắt kết nối.
frageum

9

Octave, 53 51 byte

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

Dùng thử trực tuyến!

* Vì op đã bỏ yêu cầu để kiểm tra câu trả lời đầu vào trống được hoàn nguyên về lần chỉnh sửa đầu tiên của tôi.

Giải trình:

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

Vết bẩn , 29 byte

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

Hãy thử trực tuyến! Hầu hết các trường hợp thử nghiệm đã hết thời gian trên TIO. Thay thế <0C>bằng <0CoF>để làm cho nó nhanh hơn một chút.

Giải trình

Tôi đang kiểm tra xem từ mọi #nơi có một đường dẫn đến a `và có tồn tại ít nhất một đường dẫn không #. Gần đây tôi đã thêm các lệnh xoay vòng vào Grime, điều này làm cho thử thách này dễ dàng hơn nhiều.

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 byte

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)

Trường hợp \nđại diện cho nhân vật dòng chữ mới. Cố gắng loại bỏ tất cả #từng cái một bằng cách tìm một cái liền kề với a `và thay đổi nó thành a `. Trả về truenếu có ít nhất một #bản gốc nhưng tất cả đã bị xóa. Phiên bản yêu cầu đầu vào đệm cho 118 117 byte:

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 byte

{?/\#/&&?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}

Kiểm tra xem đầu vào có chứa ít nhất một #và nếu mọi thứ #có thể tìm thấy đường dẫn đến a `.

Khá kém hiệu quả, bởi vì đường dẫn bị ép buộc sử dụng hàm đệ quy luôn truy cập tất cả các vùng khác #trong cùng khu vực được kết nối (nghĩa là không bị đoản mạch).

Sử dụng một số tương tác không linh hoạt giữa các toán tử Junctiontrượt , để đảm bảo rằng kiểm tra đường dẫn được bỏ qua cho các ký tự khoảng trắng mà không yêu cầu kiểm tra riêng cho bên ngoài chức năng tìm đường.


5

Python 3 , 214 206 byte

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}

Hãy thử trực tuyến!

Dòng đầu tiên ở đây được dành để đệm tất cả các dòng có cùng độ dài: chúng tôi chia chuỗi ( s.split('\n')ngắn hơn một char s.splitlines()), tìm độ dài tối đa của một dòng và gán cho C một danh sách làm phẳng tất cả các ký tự sau khi đệm từng ký tự hàng. (Các dòng mới đã biến mất.)

Sau đó, chúng tôi lập một danh sách trong đó mỗi ký tự không phải không gian liền kề với ít nhất một backtick được thay thế bằng backtick và tiếp tục cho đến khi không có thay đổi nào xảy ra (khi danh sách cũ obằng C. Chúng tôi có thể so sánh C>othay C!=ovì vì thay thế # (ASCII 35 ) với `(ASCII 96) chỉ có thể tăng thứ tự từ điển của danh sách.)

Nếu không còn # nào, và ít nhất một cái đã có mặt ban đầu, lâu đài là hợp lệ.

  • Đã lưu tám byte kiểm tra # trong chênh lệch đã đặt, thay vì '#'in s and'#'not in C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.