Başarısız Kaleleri Algıla


40

Yerçekiminin ilginç yönlerinden biri, farkında olduğum kadarıyla havada asılı kalan şeylere sahip olamayacağınızdır.

Bununla birlikte, Rastgele Kale Yapımcıları Birliği'ndeki herkes bu gerçeğin farkında değil, bunun gibi kalelere yol açıyor gibi görünüyor:

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

ve bu:

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

ve hatta bunu:

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

Meydan okuma

Geçerli bir kale için, tüm bloklar doğrudan veya dolaylı olarak yere bağlanacaktır. Kişisel program veya fonksiyon böyle olanları girdi olarak yukarıdaki gibi bir kale verilecek ve program dönmelidir truthy veya falsy değerini kale geçerli olup olmadığını yansıtmaktadır.

kurallar

  • Giriş bir dize olarak verilir.
  • Tüm geçerli kaleler bir yüzeye dayanır ````````. (Giriş dizesi yoksa değil bir yüzey ihtiva kale geçersiz.)
  • Tüm girdilerin bu kriterleri karşılayacağını varsayabilirsiniz:
    • Yüzey her zaman düz olacaktır.
    • Yüzey her zaman en az kale kadar geniş olacaktır, bu nedenle zeminin solunda veya sağında bloklar olmayacaktır.
    • Giriş hiçbir zaman #yüzeyin altında olmayacak .
    • Girdi yalnızca bu zorlukla verilen karakterleri içerecektir. ( #, `boşluk veya yeni satır.)
    • Girişin her zaman en az bir karakter içereceğini varsayabilirsiniz.
  • Bloklar yatay veya dikey olarak bitişikse bağlanır. Köşegen sayılmaz!
    • Bağlı:
      #	or	##
      #
    • Bağlı değil:
      #      or	# #	or	 #
      #
      #
  • Kalelerin geçerli olması için var olması gerekir. (Başka bir deyişle, girişi olmayan girdiler #sahte bir değer vermelidir.)
  • Girdi yalnızca bu zorlukla verilen karakterleri içerecektir. ( #, `boşluk veya yeni satır.)
  • Girişin her zaman en az bir karakter içereceğini varsayabilirsiniz.
  • Standart G / Ç ve kaçamak kuralları uygulanır.

Test durumları

Falsy

  • Yukarıda verilen tüm örnekler.
  • # # # # 
    # #### ####
    #### # # ####
    #############
    ###### ######
    ## ### #####
    (Zemin yok.)
  • # 
    ### ####
    #### # # ####
    #############
    ######
    # ####
    `` `` `` `` `` `` `
    (En üstteki blok yatay ya da dikey olarak bağlanmamıştır.)
  •    
    `
    (Kale yok.)


  • # # # # # # #
    #############
    ##### ## #####
    # # # # # # # # # # # # #### # # #### # # # # # # # #
    #### #### #### #### ## #### ## #### #### #### ####
    ## ## # # #### # # #### # # #### # # #### # # #### # # #### # # # #### # # ####
    ################################################## ############################
    ###### ######## ## ##### ####### ####### ######## ####### ######## #### ##
    ################################### ###### ####### ############################
    ############################ ###### ######### ##########################
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``
    (Merkez kule kalenin geri kalanına bağlı değildir, çünkü onu birbirine bağlayan yatay veya dikey olarak bitişik bloklar yoktur.)
  •    
    (Kale yok.)

  • (Kale yok, sadece tek bir yeni satır karakteri.)
  • # # 
    #
    `` `` ``
    (En sağdaki blok yatay veya dikey olarak bağlanmamıştır.)
  •    
    `
    (Kale yok.)

Doğru

  • # 
    `
  • # # # # 
    # #### ####
    #### # # ####
    #############
    ###### ######
    ## ### #####
    `` `` `` `` `` `` `
  •                       #
    #
    # # # # ###
    #### #### # #
    #### # # #### ###
    ############## ###
    ###### ###### ###
    ##### ##### ###
    ##### ##### ###
    ``````````````````````````````
  •                                        # # # # # # #    
    #############
    # ### #### ###
    # # # # # # # # # # # ### #### ### # # # # # # # #
    # #### #### #### #### ############# #### #### #### ## ##
    #### # # #### # # #### # # #### ## ####### ## #### # # # #### # ## ## # ####
    ########################################## ##################################
    ###### ## ##### ####### ####### ######## ####### ######## #### ######
    ############################### ##### # ################################
    ############################ ###### ######## ##########################
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``
  •                       #### ### 
    # #### ###
    # ###
    # ##
    #
    ###
    #####
    #######
    #########
    ### #####
    ##### #####
    ###### ######
    ################
    # ### ########## #
    #############
    #############
    #############
    ###### ######
    ###### ######
    #############
    ###########
    ############
    ###########
    # ###### ##### #
    ###### ######
    ############
    ########### #
    ######### ##
    ##########
    ##### ######
    ###### ######
    ########## ##
    #############
    #############
    #############
    ######### ####
    ##### #####
    ##### #####
    ##### #####
    `` `` `` `` `` `` `` `` `
  •                                                 
    ####
    #####
    ######
    ####
    ####
    #####
    ########
    ##########
    #### ######
    ###########
    ############
    ##############
    ##### ## ############
    ########## #################
    ##################################
    ###### ##########################
    ############## ÖRNEK
    KURULUŞ ŞEY ####
    ############################
    ################## #
    `` `` `` `` `` `` `` `` `````````````````````k " '

İyi şanslar!


Girişin tüm satırlarının aynı uzunlukta olacağını varsayabilir miyiz (yani boşluklarla dolu)?
sml

@smls Hayır, girişin yastıklı olacağını varsayamazsınız.
user2428118

1
@smls Re # 1 ve # 2: Aslında gönderilerin bu konuyla uğraşmak zorunda olmadıklarını belirtmek istemiştim, ama şimdi şunu yazdım. Henüz bunlarla ilgilenen hiçbir çözüm bulunmadığı için, soruyu güncelleyeceğim; Re # 3: Kodun Falsy test durumu 2, 4 ve 6'nın doğru şekilde işleyeceği bir durumu gerçekten düşünemiyorum, ancak toprağa bağlı hiçbir blok bulunmadığı bir durumu tespit edemedi . Re # 4: Bununla ne demek istediğinizi anlamadım. Bu zaten 1 numaralı Truthy test durumu tarafından ele alınmamış mı?
user2428118


2
Muz kalesi mi? EN İYİ KALE
Matthew Roh,

Yanıtlar:


11

Salyangoz , 21 18 bayt

Zorla düzenlenmiş ek giriş kısıtlamaları nedeniyle -3 bayt.

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

Maalesef, zaman karmaşıklığı faktördür, bu nedenle girdilerin çoğu çalıştırılamaz.

Sahte durumlar için 0, ve #gerçek durumlar için sayılar çıktı.

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

Bu, Zgarb'ın cevabına kale olarak gönderdiğiniz örneği tanımıyor. Bunların kaleler olarak algılanmaması gerektiğini söyleyen kurallarda hiçbir şey görmüyorum ? Kurallar, yalnızca her biri #yere bağlıysa bir kale olduğunu söylüyor .
Martin Ender

@Zgarb Hayır, açıklamada bir hata var - +aslında 1 ya da daha fazla kez, 0 değil. Bağlantısız kalelere izin verdikten sonra yine de farklı görünecek.
feersum

9

Octave, 53 51 bayt

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

Çevrimiçi Deneyin!

* Op, boş giriş cevabını kontrol etme zorunluluğunu bıraktığım için ilk düzenlememe geri döndü.

Açıklama:

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

Kir , 29 bayt

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

Çevrimiçi deneyin! Çoğu test vakası TIO'da zaman aşımına uğradı. Biraz daha hızlı yapmak için <0C>ile değiştirin <0CoF>.

açıklama

Her şeyin #bir yolunun `var olduğunu ve en az birinin var olduğunu kontrol ediyorum #. Son zamanlarda Grime'ye rotasyon komutları ekledim, bu da bu mücadeleyi çok daha kolaylaştırıyor.

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 bayt

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)

Nerede \nliteral satır karakteri temsil eder. A'ya #bitişik bir tane bularak ve hepsini a olarak `değiştirerek bir kerede hepsini çıkarmaya çalışır `. İade truedurumunda en az bir vardı #başlangıçta ama hepsi kaldırıldı vardı. 118 117 bayt için yastıklı giriş gerektiren versiyon :

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 bayt

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

Girişin en az bir içerip içermediğini #ve her birinin #a yolunu bulabildiğini kontrol eder `.

Aksine verimsizdir, çünkü yol bulma, her zaman #aynı bağlı bölgedeki diğer bölgeleri (yani kısa devre yapmaz) ziyaret eden özyinelemeli bir işlev kullanarak kaba şekilde zorlanır .

Junction operatörleri ile kayma arasındaki bazı istenmeyen etkileşimlerden yararlanarak, yol testi işlevinin dışına yönelik kontrol yapılmasına gerek kalmadan, boşluk karakterleri için yol testinin atlandığından emin olun.


5

Python 3 , 214 206 bayt

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}

Çevrimiçi deneyin!

Buradaki ilk satır, tüm satırları aynı uzunluğa kadar doldurmaya adanmıştır: dizeyi böldük ( s.split('\n')ondan daha kısa bir karakter s.splitlines()), bir satırın maksimum uzunluğunu bulur ve C'ye, her birini doldurduktan sonra tüm karakterlerin düzleştirilmiş bir listesini atarız. hat. (Yeni hatlar gitti.)

Sonra en az bir backtick bitişik olmayan her boşluk karakterinin backtick yerine bir liste yap ve herhangi bir değişiklik oldu dek eski liste zaman (devam oeşittir C. Biz birlikte karşılaştırabilirsiniz C>oyerine C!=oçünkü # değiştirilmesi (ASCII 35 ) `ile (ASCII 96) yalnızca listenin sözlük sıralamasını artırabilir.)

Eğer # kalırsa ve başlangıçta en az bir tane mevcutsa, kale geçerlidir.

  • Ayarlanan farktan # yerine kontrol etmek için sekiz bayt kaydedildi '#'in s and'#'not in C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.