ここに住んでもいいですか?


16

ゲームTerrariaでは、ゲームメカニクスの1つにNPCが入居できるように家を建てることが含まれます。有効な家と見なされるかどうかについての厳しいルールセットがあります。ルールのリストは次のとおりです。

  1. 家の総面積は、少なくとも60平方タイルで、750未満でなければなりません。また、外枠を含む家のサイズは、少なくとも次のいずれかでなければなりません。

    5x12
    6x10
    7x9
    8x8
    9x7
    10x6
    12x5
    15x4
    

    簡単にするために、次のことを安全に想定できます。a)すべての入力家は長方形であり、b)#家の中には固体のタイルはありません。こちらが12x6フレームです(美しいASCIIで描かれています):

    ############
    #          #
    #          #
    #          #
    #          #
    ############
    
  2. 家は背景の壁で覆われている必要があります。これらは固体のタイルではなく、三次元の家の後ろの壁です。穴は許可されますが、4x4より大きくすることはできません。行に5つ以上のスペース文字の行または列がある場合、これは4x4より大きい穴であり、家は無効です。複数の穴も許可されますが、少なくとも1つの壁が離れている必要があります。

    ############
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
    ############
    #*    *    #
    #*    *    #
    #*    *    #
    #******    #
    ############  (Still acceptable since neither hole is larger than 4x4 and there is a separator)
    
    ############
    #    ******#
    #***    ***#
    #    ******#
    #***    ***#
    ############  (Also still valid. No row or column of blank spaces is longer or taller than 4.)
    
  3. 入り口が必要です。これは|、側面のドア、または-床または天井のプラットフォームです。入り口が角にある場合、NPCは入場できません。また、床にプラットフォームがある場合、NPCが立つには少なくとも1つのソリッドブロックが必要です。この固体ブロックは、左側または右側の側壁に直接隣接することはできません。これらはすべて、入り口のある有効な家です。

    ############
    #**********#
    |**********#
    #**********#
    #**********|
    ############  (Multiple doors, or doors up high are okay)
    
    ############
    #**********#
    #**********#
    #**********#
    #**********#
    #######----#
    
    #----#######
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
  4. 少なくとも1つの光源$、テーブルT、椅子が必要ですが、それ以上の光源Cも使用できます。光源は空中または地面に置くことができますが、テーブルと椅子は両方とも地面、例えば最下列になければなりません。

    ############
    #**********#
    #**********#
    #***$******|
    #****TC****|
    ############
    

    また、家具の後ろに壁があると想定できるため、トーチ、椅子、またはテーブルは、2つの穴の間のセパレーターとして数えられます。

    ############
    #*    *    #
    #*    *    #
    #*    $    #
    #**TC******|
    ############
    

チャレンジ

家をASCII文字列として取得し、それが有効な住宅であるかどうかにかかわらずtrue / falseを返す最短の関数を記述する必要があります。これは、改行で区切られた文字列、文字列のリスト、または妥当である限り他の方法として使用できます。私のために、それが正しく機能するかどうかをテストできるように、短いプログラムを含めてください。

参考までに、これらはすべて無効な入力です。

############
-**********#
-****$*****#
-**********#
-******TC**#
############  (You can't have platforms on the sidewalls)

###########-
#**********#
#**********#
#****$*****#
#**T***C***#
###########|  (NPC can't enter because the only entrances are on the corner)

############
#**********#
#******$***#
#**********#
#T****C****#
##--------##  (NPC has nowhere to stand)

############
#**********#
#**********#
#**********#
#**$**TC***#
##########|#  (Door cannot be in the floor or ceiling)

############
#**********#
#**********#
#**********#
|**   T C  #
############  (Since table and chair do not count as a background wall, the hole in background is too wide)

####### ####
#**********#
#**********#
#****$*****#
#**T***C***|
############  (There's a hole in the frame.)


###########################################################################
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
#                                                                         #
###########################################################################  (House is 75x11, which is too big.)

リーダーボード


6
クールな挑戦、仲間のテラリア愛好家。
Rɪᴋᴇʀ

穴が長方形であると仮定できますか?それ以外の場合、全体が4x4に収まらないが、連続して4つを超えるスペースが含まれないテストケースを使用できます。
マーティンエンダー

はっきりしない点がたくさんあります。1.フレームは長方形である必要がありますか?「すべての家は長方形になります」と言っていますが、長方形ではないが軸に沿った境界ボックスの四隅すべてに入るフレームを明確に除外していません。そして、おそらく穴を囲むことができます#。2. Martinが尋ねたように、「4x4を超える穴はない」とはどういう意味ですか (また、3番目の読み直しまで、穴が何であるかを理解していなかったことに注意してください。ゲームをプレイしていない人のために仕様を書く必要があります)。
ピーターテイラー

1
3.「この固体ブロックは壁に直接隣接することはできません」-壁とは何ですか?ポイント2からはのように見えますが*、有効なドアの特定の例は除外されます。4.「地上」は「最後から2番目の列」または「上」を意味し#ますか?5.「これはテーブルと椅子には適用されません。」ということは、4x4の穴があるTか、そのCすぐ下にあるのは大きすぎるということですか?6.「入り口のみが角にあるため、NPCは入ることができません」仕様では角について何も言わなかったと思います。彼らであってもよい-か、|他のドアがある場合は?
ピーターテイラー

7.角の入り口がアクセスを許可しないために問題になる場合、それはそれぞれ*が入り口から到達可能でなければならないことを意味しますか?または*、許可された穴の中央、部屋全体を2つに切断する穴、片側のみに入り口が許可されている穴、および直接許可された穴に入る入り口に隔離されていますか?
ピーターテイラー

回答:


2

Python 2、503 439バイト

超短ではありませんが、それは解決策です。ゴルフに何か見かけたら教えてください。それは実際に読めるので、私は同様に私のゴルフのないバージョンを見ることをお勧めします。

編集:ifループ外のすべてのsは、下部で結合されています。

def f(s):
 s=s.split("\n");e=l=0;h=len(s);w=len(s[0])
 for c in s[0][1:-1]+s[-1][1:-1]:
    if(c in"#-")<1:return 0
    if"-"==c:e=1
 for r in s[1:-1]:
    if(r[0]in"#|")*(r[-1]in"#|")<1or" "*5in r:return 0
    if"$"in r:l=1
 for r in zip(*s):
    if" "*5in`r`[2::5]:return 0
 if(h*w<60)+(h*w>749)+(w<5)+(h<4)or" "in s[0][0]+s[0][-1]+s[-1][0]+s[-1][-1]or("T"in s[-2])*("C"in s[-2])*l<1or("#"in s[-1][2:-2])<1or"|"in"".join(s[1:-1])<1>e:return 0
 return 1

オンラインで試す

ゴルフをしていない:

Falseデバッグの目的で、結果がである理由も出力します。

def f(s):

    # check dimensions
    s=s.split("\n")
    h=len(s)
    w=len(s[0])
    if h*w < 60 or h*w > 749 or w<5 or h<4: return False,"Size"

    # top / bottom
    e=0
    for c in s[0][1:-1]+s[-1][1:-1]:
        if(c in"#-")<1:return False,"T/B"

        # entrance
        if"-"==c:e=1

    # no spaces in corners -_-
    if" "in s[0][0]+s[0][-1]+s[-1][0]+s[-1][-1]: return False,"Corner"

    # light, table, chair
    l=t=c=0

    # left / right
    for r in s[1:-1]:
        if(r[0]in"#|")*(r[-1]in"#|")<1: return False,"L/R"

        # walls, put above
        if" "*5in r: return False,"Walls"

        # light
        if"$"in r:l=1

    # table, chair
    if"T"in s[-2]:t=1
    if"C"in s[-2]:c=1

    if l*t*c<1: return False,"L/T/C"

    # wall columns
    for r in zip(*s): # Transpose
        if" "*5in`r`[2::5]: # Tuple to string
            return False,"Walls"

    # entrance
    if"|"in"".join(s[1:-1])<1>e: return False,"Entrance"

    # place to stand
    if("#"in s[-1][2:-2])<1: return False,"Stand"

    return True

オンライン版の未ゴルフ版

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.