ตรวจจับปราสาทที่ล้มเหลว


40

หนึ่งในแง่มุมที่น่าสนใจของแรงโน้มถ่วงคือเท่าที่ฉันทราบคุณไม่สามารถมีสิ่งของที่ลอยอยู่กลางอากาศ

อย่างไรก็ตามดูเหมือนว่าทุกคนในสมาคมผู้สร้างปราสาทสุ่มจะไม่ตระหนักถึงความจริงนี้นำไปสู่ปราสาทเช่นนี้:

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

และอันนี้:

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

และแม้แต่อันนี้:

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

ท้าทาย

สำหรับปราสาทที่ถูกต้องบล็อกทั้งหมดจะถูกเชื่อมต่อกับพื้นดินไม่ว่าโดยตรงหรือโดยอ้อม โปรแกรมหรือฟังก์ชั่นของคุณจะได้รับปราสาทเช่นที่อยู่ด้านบนเป็นอินพุทและโปรแกรมของคุณจะต้องส่งคืนค่าความจริงหรือเท็จที่สะท้อนว่าปราสาทนั้นถูกต้องหรือไม่

กฎระเบียบ

  • อินพุตถูกกำหนดเป็นสตริง
  • ปราสาทที่ถูกต้องทั้งหมดวางอยู่บนพื้นผิว, ````````. (ถ้าสายเข้าไม่ได้มีพื้นผิวปราสาทไม่ถูกต้อง.)
  • คุณสามารถสมมติว่าการป้อนข้อมูลทั้งหมดจะเป็นไปตามเกณฑ์เหล่านี้:
    • พื้นผิวจะเรียบเสมอ
    • พื้นผิวจะต้องกว้างอย่างน้อยเท่ากับปราสาทดังนั้นจึงไม่มีบล็อกไปทางซ้ายหรือขวาของพื้นดิน
    • อินพุตจะไม่มี#ใต้พื้นผิว
    • ข้อมูลที่ป้อนจะมีอักขระที่กำหนดในการท้าทายนี้เท่านั้น ( #,, `space หรือ newline)
    • คุณอาจจะสมมติว่าข้อมูลที่ป้อนนั้นมีอักขระอย่างน้อยหนึ่งตัวเสมอ
  • บล็อกมีการเชื่อมต่อหากพวกเขาทั้งแนวนอนหรือแนวตั้ง เส้นทแยงมุมไม่นับ!
    • การเชื่อมต่อ:
      #	or	##
      #
    • ไม่ได้เชื่อมต่อ:
      #      or	# #	or	 #
      #
      #
  • ปราสาทต้องมีอยู่จริง (กล่าวอีกนัยหนึ่งอินพุตที่ไม่มีค่าใด ๆ#จะต้องให้ค่าที่ผิดพลาด)
  • ข้อมูลที่ป้อนจะมีอักขระที่กำหนดในการท้าทายนี้เท่านั้น ( #,, `space หรือ newline)
  • คุณอาจจะสมมติว่าข้อมูลที่ป้อนนั้นมีอักขระอย่างน้อยหนึ่งตัวเสมอ
  • ใช้I / Oมาตรฐานและกฎของช่องโหว่

กรณีทดสอบ

Falsy

  • ตัวอย่างทั้งหมดที่ระบุไว้ข้างต้น
  • # # # # # # # # 
    #### ####
    #### #### # # # #
    ##############
    ###### ######
    ## ### #####
    (ไม่มีพื้นดิน)
  • # 
    ### ####
    #### # ####
    ##############
    ###### ######
    ##### # ####
    `` `` `` `` `` `` `` `
    (บล็อกสูงสุดไม่ได้เชื่อมต่อทั้งแนวนอนและแนวตั้ง)
  •    
    `` `
    (ไม่มีปราสาท)


  • # # # # # # # # # # # #
    ##############
    ##### ## #####
    # # # # # # # # # # # # # # # # # # # # #### #### # # # # # # # # # # # # # # # #
    #### #### #### #### #### ## ## #### #### #### ####
    ## หมายเลข
    ################################################## ##################################
    ###### ######## ## ###### ################################################################################################################################################################################################################################################################ ##
    ################################### ###### ####### ############################
    ############################################################################################################################################################## ##########################
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``
    (หอคอยกลางไม่ได้เชื่อมต่อกับส่วนที่เหลือของปราสาทเพราะไม่มีบล็อกแนวนอนหรือแนวตั้งเชื่อมต่อกัน)
  •    
    (ไม่มีปราสาท)

  • (ไม่มีปราสาทมีอักขระขึ้นบรรทัดใหม่เพียงตัวเดียว)
  • # # 
    #
    `` `` `` ``
    (บล็อกขวาสุดไม่ได้เชื่อมต่อทั้งแนวนอนและแนวตั้ง)
  •    
    `` `
    (ไม่มีปราสาท)

Truthy

  • # 
    `
  • # # # # # # # # 
    #### ####
    #### #### # # # #
    ##############
    ###### ######
    ## ### #####
    `` `` `` `` `` `` `` `
  •                       # 
    #
    # # # # # # # # ###
    #### #### #
    #### # #### ###
    ############## ###
    # ### ###### #####
    ##### ##### ###
    ##### ##### ###
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``
  •                                        # # # # # # # # # # # #    
    ##############
    ### #### ###
    # # # # # # # # # # # # # # # # ### ### #### # # # # # # #
    ####################################################################################################################################################### ##
    #### #### # # # # # # # # # # # # #### #### ## ######## ## #### #### # # # # # # # # ## ## # ####
    ############################################################################################################################################################ ของอินเดีย ##########################################
    ###### ## ###### ################################################################################################################################################################################################################################################################ #### ######
    ######################################################################################################################### โรงแรม # ######################################################################################
    ############################################################################################################################################################# ##########################
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``
  •                       #### ### 
    # ### ####
    # ###
    # ##
    #
    ###
    #####
    #######
    #########
    ### ## #####
    ##### #####
    ###### ######
    #################
    # ### ########## #
    #############
    #############
    #############
    ###### ######
    ###### ######
    ###################
    #############
    #############
    #############
    ###### ##### #
    ###### ######
    #######################################################################################################################################################################################
    _
    2_14664 ##
    #############
    ###### ######
    ###### ######
    ########### ##
    #############
    #############
    #############
    ######### ####
    ##### #####
    ##### #####
    ##### #####
    `` `` `` `` `` `` `` `` `` `` ` `` `` `
  •                                                 
    ####
    #####
    ######
    ####
    ####
    #####
    ########
    ##########
    #### ######
    ###########
    ############
    ##############
    ##### ## ##############
    ########### #################
    ###########################################
    ####### #################################
    ################# ####################
    ############################## ####
    ############################
    ################## #
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ` `

โชคดี!


เราสามารถสมมติว่าทุกบรรทัดของอินพุตจะมีความยาวเท่ากัน (เช่นเติมด้วยช่องว่าง) ได้หรือไม่?
smls

@smls ไม่คุณไม่สามารถสันนิษฐานได้ว่าอินพุตจะถูกเติม
user2428118

1
@smls Re # 1 และ # 2: ฉันตั้งใจจะระบุว่าการส่งไม่ต้องจัดการเรื่องนั้น แต่ตอนนี้ฉันเห็นแล้วว่านั่นไม่ใช่วิธีที่ฉันเขียนลงไป เนื่องจากยังไม่มีวิธีแก้ไขที่โพสต์ซึ่งจัดการกับสิ่งเหล่านี้ฉันจะอัปเดตคำถามเพื่อให้ชัดเจนว่าคุณไม่ต้องจัดการกับสิ่งเหล่านี้ Re # 3: ฉันไม่สามารถนึกถึงสถานการณ์ที่รหัสจะจัดการกรณีทดสอบFalsy ที่ 2, 4 และ 6 ได้อย่างถูกต้องแต่ยังไม่สามารถตรวจจับสถานการณ์ที่ไม่มีบล็อกที่เชื่อมต่อกับพื้น Re # 4: ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ไม่ได้รับการจัดการโดยTruthy test case หมายเลข 1 อยู่แล้ว
2428118


2
ปราสาทกล้วย ปราสาทที่ดีที่สุด
Matthew Roh

คำตอบ:


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 ไม่มีข้อผิดพลาดในการอธิบาย - +จริง ๆ แล้ว 1 ครั้งขึ้นไปไม่ใช่ 0 มันจะดูแตกต่างออกไปหลังจากปล่อยปราสาทที่ไม่ได้เชื่อมต่อแล้ว
feersum

9

อ็อกเทฟ 53 53ไบต์

@(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>เพื่อให้เร็วขึ้นเล็กน้อย

คำอธิบาย

ผมว่าการตรวจสอบจากทุก#มีอยู่เส้นทางไปได้และที่มีอยู่อย่างน้อยหนึ่ง` #ฉันเพิ่งเพิ่มคำสั่งการหมุนใน 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หมายถึงอักขระ newline ที่แท้จริง พยายามที่จะลบทั้งหมด#หนึ่งที่เวลาโดยการหาหนึ่งที่อยู่ติดกับและการเปลี่ยนแปลงไป` `ผลตอบแทนtrueถ้ามีอย่างน้อยหนึ่ง#เดิม แต่มีทั้งหมดถูกลบออก เวอร์ชันที่ต้องมีการเพิ่มเบาะให้118 118ไบต์:

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}

การตรวจสอบถ้าใส่มีอย่างน้อยหนึ่ง#และถ้าทุกคนสามารถหาเส้นทางไปที่#`

ค่อนข้างไม่มีประสิทธิภาพเนื่องจากการหาเส้นทางถูกบังคับโดยใช้ฟังก์ชันแบบเรียกซ้ำที่จะเข้าชมพื้นที่อื่น ๆ#ที่เชื่อมต่อกันอยู่เสมอ(เช่นไม่มีการลัดวงจร)

ใช้การโต้ตอบที่ไม่บริสุทธิ์ระหว่างตัวดำเนินการJunctionและลื่นไถลเพื่อให้แน่ใจว่าการทดสอบพา ธ ถูกข้ามสำหรับอักขระช่องว่างโดยไม่ต้องการการตรวจสอบแยกต่างหากสำหรับภายนอกฟังก์ชั่นการทำพา ธ


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 เป็นรายการอักขระทั้งหมดหลังจากทำการเพิ่ม เส้น (บรรทัดใหม่หายไป)

จากนั้นเราสร้างรายการที่อักขระที่ไม่ใช่ช่องว่างที่อยู่ติดกับ backtick อย่างน้อยหนึ่งตัวถูกแทนที่ด้วย backtick และดำเนินการต่อไปจนกว่าจะไม่มีการเปลี่ยนแปลงเกิดขึ้น (เมื่อรายการเก่าoเท่ากับCเราสามารถเปรียบเทียบC>oแทนC!=oเพราะแทนที่ # (ASCII 35 ) ด้วย `(ASCII 96) สามารถเพิ่มการเรียงลำดับพจนานุกรมได้ของรายการเท่านั้น)

หากไม่มี # เหลืออยู่และอย่างน้อยก็มีอยู่ครั้งแรกปราสาทจะใช้ได้

  • บันทึกแปดไบต์เพื่อตรวจสอบ # ในความแตกต่างของชุดมากกว่า '#'in s and'#'not in C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.