Deteksi Kastil Gagal

40

Salah satu aspek gravitasi yang menarik adalah, sejauh yang saya ketahui, Anda tidak bisa membiarkan benda-benda melayang di udara.

Namun, tampaknya tidak semua orang di Asosiasi Pembuat Kastil Acak menyadari fakta ini, mengarah ke kastil seperti ini:

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

dan yang satu ini:

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

dan bahkan yang ini:

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

Tantangan

Untuk kastil yang valid, semua blok akan terhubung ke tanah baik secara langsung maupun tidak langsung. Anda program atau fungsi akan diberikan sebuah benteng seperti yang di atas sebagai input, dan program anda harus mengembalikan truthy atau nilai falsy mencerminkan apakah benteng tersebut valid atau tidak.

Aturan

  • Input diberikan sebagai string.
  • Semua kastil yang valid terletak di atas permukaan ````````,. (Jika string input tidak mengandung permukaan, kastil tidak valid.)
  • Anda dapat menganggap semua input akan memenuhi kriteria ini:
    • Permukaan akan selalu rata.
    • Permukaan akan selalu setidaknya selebar kastil, sehingga tidak akan ada blok ke kiri atau kanan tanah.
    • Masukan tidak akan pernah ada di #bawah permukaan.
    • Input hanya akan berisi karakter yang diberikan dalam tantangan ini. ( #,, `spasi atau baris baru.)
    • Anda dapat berasumsi bahwa input akan selalu mengandung setidaknya satu karakter.
  • Blok terhubung jika mereka berdekatan secara horizontal atau vertikal. Diagonal tidak masuk hitungan!
    • Terhubung:
      #	or	##
      #
    • Tidak terhubung:
      #      or	# #	or	 #
      #
      #
  • Kastil harus ada agar valid. (Dengan kata lain, input tanpa input #harus memberikan nilai palsu.)
  • Input hanya akan berisi karakter yang diberikan dalam tantangan ini. ( #,, `spasi atau baris baru.)
  • Anda dapat berasumsi bahwa input akan selalu mengandung setidaknya satu karakter.
  • Standar I / O dan aturan celah berlaku.

Uji kasus

Palsu

  • Semua contoh yang diberikan di atas.
  • # # # # 
    #### ####
    #### # # ####
    ##############
    ###### ######
    ## ### #####
    (Tidak ada tanah.)
  • # 
    ### ####
    #### # # ####
    ##############
    ###### ######
    ##### # ####
    `` `` `` `` `` `` ``
    (Blok paling atas tidak terhubung secara horizontal atau vertikal.)
  •    
    `` `
    (Tidak ada kastil.)



  • ############################################## # # # # # # # # # # # # # # # # # #
    #####
    # # # # # # # #
    #### #### #### #### ## #### ## #### #### #### ####
    ## ## # # #### # # #### # # #### # # #### # # #### # # #### # # #### # # #### # # ####
    ############################################### ##################################
    ###### ######## ## ###### ######## #################################### ##
    ##################################################### ############################
    ##################################################### #########################
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `
    (Menara pusat tidak terhubung ke seluruh kastil karena tidak ada blok yang berdekatan secara horizontal atau vertikal yang menghubungkannya.)
  •    
    (Tidak ada kastil.)

  • (Tidak ada kastil, hanya satu karakter baris baru.)
  • # # 
    #
    `` `` `` `
    (Blok paling kanan tidak terhubung baik secara horizontal maupun vertikal.)
  •    
    `` `
    (Tidak ada kastil.)

Sejujurnya

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

Semoga berhasil!

pengguna2428118
sumber
Bisakah kita menganggap semua garis input akan sama panjangnya (mis. Diisi dengan spasi)?
smls
@smls Tidak, Anda tidak dapat menganggap input akan diisi.
user2428118
1
@smls Re # 1 dan # 2: Saya sebenarnya bermaksud menentukan bahwa pengiriman tidak harus mengatasinya, tapi sekarang saya tahu bukan itu cara saya menuliskannya. Karena belum ada solusi yang diposting yang menangani hal-hal ini, saya akan memperbarui pertanyaan sehingga jelas Anda tidak harus menangani ini. Re # 3: Saya tidak bisa benar-benar memikirkan situasi di mana kode akan menangani dengan benar Falsy test case 2, 4 dan 6 namun gagal mendeteksi situasi di mana tidak ada blok sama sekali yang terhubung ke tanah. Pikiran # 4: Saya tidak yakin apa yang Anda maksud dengan itu. Bukankah itu sudah ditangani oleh Truthy test case nomor 1?
user2428118
1
Terkait
Zgarb
2
Kastil pisang? CASTLE BEST EVER
Matthew Roh

Jawaban:

11

Siput , 21 18 byte

-3 byte karena kendala input tambahan yang diedit menjadi tantangan.

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

Sayangnya kompleksitas waktu adalah faktorial, sehingga sebagian besar input tidak dapat dijalankan.

Keluaran 0 untuk kasus palsu, dan jumlah #untuk kasus kebenaran.

                 ,,
!{ 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
feersum
sumber
Ini tidak mengenali contoh yang Anda poskan pada jawaban Zgarb sebagai kastil. Saya tidak melihat apa pun dalam aturan yang mengatakan ini seharusnya tidak terdeteksi sebagai kastil? Aturan hanya mengatakan bahwa itu adalah kastil jika masing #- masing terhubung ke tanah.
Martin Ender
@ Zgarb Tidak, ada bug dalam penjelasannya - +sebenarnya 1 atau lebih kali, bukan 0. itu akan tetap terlihat berbeda setelah mengizinkan kastil yang terputus.
feersum
9

Oktaf, 53 51 byte

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

Cobalah secara Online!

* Karena persyaratan yang dijatuhkan untuk memeriksa jawaban input kosong dikembalikan ke edit pertama saya.

Penjelasan:

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
rahnema1
sumber
6

Grime , 29 byte

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

Cobalah online! Sebagian besar kasus uji waktu habis di TIO. Ganti <0C>dengan <0CoF>untuk membuatnya sedikit lebih cepat.

Penjelasan

Saya memeriksa bahwa dari setiap #ada jalur ke `, dan ada setidaknya satu #. Saya baru-baru ini menambahkan perintah rotasi ke Grime, yang membuat tantangan ini lebih mudah.

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 #.
Zgarb
sumber
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)

Dimana \nmewakili karakter baris baru literal. Mencoba untuk menghapus semua #satu per satu dengan menemukan satu yang berdekatan dengan `dan mengubahnya menjadi `. Mengembalikan truejika ada setidaknya satu #awalnya tetapi ada semua dihapus. Versi yang membutuhkan input empuk untuk 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)
Neil
sumber
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}

Cek apakah input mengandung setidaknya satu #, dan jika setiap #dapat menemukan jalur ke a `.

Agak tidak efisien, karena pathfinding dipaksakan dengan menggunakan fungsi rekursif yang selalu mengunjungi semua #wilayah terhubung yang sama (yaitu tidak mengalami hubung singkat).

Menggunakan beberapa interaksi yang tidak suci antara operator Junction dan tergelincir , untuk memastikan bahwa tes jalur dilewati untuk karakter ruang tanpa memerlukan pemeriksaan terpisah untuk itu di luar fungsi pathfinding.

seseorang
sumber
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}

Cobalah online!

Baris pertama di sini dikhususkan untuk melapisi semua baris ke panjang yang sama: kita membagi string ( s.split('\n')lebih pendek satu karakter dari s.splitlines()), menemukan panjang maksimum garis, dan menetapkan C daftar daftar semua karakter setelah masing-masing melapisi masing-masing baris. (Baris baru hilang.)

Kemudian kami membuat daftar di mana setiap karakter non-spasi yang berdekatan dengan setidaknya satu backtick digantikan oleh backtick, dan terus sampai tidak ada perubahan terjadi (ketika daftar lama osama dengan C. Kita dapat membandingkan dengan C>oalih - alih C!=okarena mengganti # (ASCII 35 ) dengan `(ASCII 96) hanya dapat meningkatkan urutan leksikografis daftar.)

Jika tidak ada yang tersisa, dan setidaknya ada satu yang hadir pada awalnya, kastil tersebut valid.

  • Disimpan delapan byte memeriksa # dalam perbedaan yang ditetapkan, daripada '#'in s and'#'not in C
Nick Matteo
sumber