失敗した城の検出


40

重力の興味深い側面の1つは、私が知る限り、空中に物を浮遊させることはできないということです。

しかし、ランダムキャッスルビルダーズ協会の全員がこの事実を知っているわけではないようです。

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

そしてこれは:

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

そしてこれも:

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

チャレンジ

有効な城では、すべてのブロックが直接または間接的に地面に接続されます。あなたのプログラムや機能には、そのようなものを入力として、上記のように城を与えられます、そして、あなたのプログラムは返さなければなりませんtruthyまたはfalsy値城が有効かどうかを反映します。

ルール

  • 入力は文字列として与えられます。
  • 有効なすべての城は、表面上にあり````````ます。(入力文字列にサーフェスが含まれていない場合、城は無効です。)
  • すべての入力がこれらの基準を満たすと仮定できます。
    • 表面は常に平らです。
    • 表面は常に少なくとも城と同じ幅になるため、地面の左右にブロックはありません。
    • 入力が#サーフェスの下にあることはありません。
    • 入力には、このチャレンジで指定された文字のみが含まれます。(#`、スペースや改行。)
    • 入力には常に少なくとも1つの文字が含まれると想定できます。
  • ブロックは、水平または垂直に隣接している場合に接続されます。対角線はカウントされません!
    • 接続済み:
      #	or	##
      #
    • 接続されていません:
      #      or	# #	or	 #
      #
      #
  • 城は有効である必要があります。(言い換えると、入力がない場合#は偽の値を与える必要があります。
  • 入力には、このチャレンジで指定された文字のみが含まれます。(#`、スペースや改行。)
  • 入力には常に少なくとも1つの文字が含まれると想定できます。
  • 標準のI / Oおよび抜け穴の規則が適用されます。

テストケース

偽物

  • 上記のすべての例。
  • ## ## 
    #### ####
    #### ## ####
    ##############
    ###### ######
    ## ### #####
    (地面なし)

  • ### ####
    #### ### ####
    ##############
    ###### ######
    ###### ####
    `` `` `` `` `` `` `` ``
    (一番上のブロックは、水平にも垂直にも接続されていません。)
  •    
    `` `
    (城はありません。)


  • ### ###
    ##############
    ##### ## #####
    #### #### #### ### #### ### ### ###
    #### #### #### #### ## #### ## #### #### #### ####
    ## ##################################################
    ################################################## ##################################
    ###### ########## ## ###### ######## ######## ######## ######## ######## #### ##
    ################################### ###### ####### ############################
    ##################################### ###### ######### ##########################
    `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``
    (中央塔は、水平または垂直に隣接するブロックが接続されていないため、城の他の部分には接続されていません。)
  •    
    (城はありません。)

  • (城はなく、改行文字が1つだけです。)
  • ## 

    `` `` `` `
    (一番右のブロックは水平にも垂直にも接続されていません。)
  •    
    `` `
    (城はありません。)

真実の


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


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

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

がんばろう!


入力のすべての行が同じ長さ(つまり、スペースで埋められている)であると想定できますか?
SMLS

@smlsいいえ、入力がパディングされるとは想定できません。
user2428118

1
@smls Re#1および#2:私は実際に、サブミッションがそれを処理する必要がないことを指定するつもりでしたが、今ではそれを書き留めた方法ではないことがわかりました。これらのことを処理するソリューションがまだ投稿されていないため、これらを処理する必要がないことが明確になるように質問を更新します。Re#3:コードがFalsyテストケース2、4、6を正しく処理しても、ブロックが地面にまったく接続されていない状況を検出できない状況については、本当に考えられません。日時#4:それがどういう意味かわかりません。これは、Truthyテストケース1 で既に処理されていませんか?
user2428118


2
バナナの城?EVER BEST CASTLE
マシュー盧

回答:


11

カタツムリ21 18バイト

チャレンジに編集された追加の入力制約のため、-3バイト。

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

残念ながら、時間の複雑さは階乗であるため、ほとんどの入力は実行できません。

偽の場合は0を出力し、偽の場合はnumberを出力します#

                 ,,
!{ 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の答えに城として投稿した例を認識しません。これら城として検出されるべきではないというルールには何もありませんか?ルール#は、それぞれが地面に接続されている場合、それは城だと言うだけです。
マーティンエンダー

@Zgarbいいえ、説明にはバグがあります- +実際には1回以上であり、0ではありません。切断された城を許可した後、とにかく違って見えるでしょう。
feersum

9

オクターブ、 53 51バイト

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

オンラインでお試しください!

*空の入力回答をチェックする必要がなくなったため、最初の編集に戻りました。

説明:

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>少し速くそれを作るために。

説明

私はすべてから#そこへのパス`が存在し、少なくとも1つ存在することを確認してい#ます。最近、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)

where \nは、リテラルの改行文字を表します。に#隣接するものを見つけ`てそれをaに変更することにより、すべてのsを一度に1つずつ削除しようとし`ます。最初trueに少なくとも1つ#はあったが、すべて削除された場合に返します。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

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}

入力に少なくとも1つが含まれている#かどうか、すべて#のパスがを見つけることができるかどうかを確認します`

パス#接続は、同じ接続領域の他のすべてを常に訪問する(つまり、短絡しない)再帰関数を使用してブルートフォースされるため、むしろ非効率的です。

間にいくつかの不浄の相互作用使用ジャンクションオペレータと滑りを経路探索機能と外側のための別個のチェックを必要とせずにパス試験は、空白文字のためにスキップされることを保証するために、。


5

Pythonの3214の 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')より短い1文字ですs.splitlines())、行の最大長を見つけ、それぞれにパディングした後のすべての文字のフラットリストをCに割り当てますライン。(改行はなくなりました。)

その後、我々は、少なくとも一つのバッククォートに隣接する各非空白文字がバッククォートによって置き換えられてリストを作成し、何の変化も起こらなかっまで、古いリストがとき(継続oに等しいですC。私たちは、と比較することができC>o代わりのC!=oため、#を置き換える(ASCII 35 ) `(ASCII 96)を使用すると、リストの辞書順を増やすことしかできません。)

#が残っておらず、少なくとも1つが最初に存在した場合、城は有効です。

  • セットの違いで#をチェックするのではなく、8バイトを保存しました '#'in s and'#'not in C
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.