Burada yaşayabilir miyim?


16

Terraria oyununda , oyun mekaniğinden biri, bir NPC'nin taşınabilmesi için ev inşa etmeyi içerir. Geçerli bir ev olarak sayılan veya sayılmayanlar için katı kurallar vardır. İşte kuralların listesi:

  1. Evdeki toplam alan en az 60 kare kiremit, ancak 750'den az olmalıdır. Ayrıca, dış çerçeve dahil evin büyüklüğü aşağıdakilerden en az biri olmalıdır:

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

    basitlik açısından, aşağıdakileri güvenle yapabilirsiniz: a) Tüm girdi evleri dikdörtgenler olacaktır ve b) #evin içinde hiçbir katı kiremit olmayacaktır. İşte 12x6 çerçevemiz (güzel ASCII'de çizilmiş):

    ############
    #          #
    #          #
    #          #
    #          #
    ############
    
  2. Evin arka plan duvarlarla kaplanması gerekir. Bunlar sağlam fayanslar değil , üçüncü boyutta evin arkasında bir duvar . Deliklere izin verilir, ancak hiçbir delik 4x4'ten daha büyük olamaz. Bir satırda 5 veya daha fazla boşluk karakteri içeren bir satır veya sütun varsa, bu 4x4'ten büyük bir deliktir ve ev geçersizdir. Birden fazla deliğe de izin verilir, ancak aralarında en az bir duvar olması gerekir.

    ############
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
    ############
    #*    *    #
    #*    *    #
    #*    *    #
    #******    #
    ############  (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. Bir giriş olmalı. Bu |yanlarda bir kapı veya -zeminde veya tavanda bir platform olabilir . Tek giriş köşede ise, NPC giremez. Ayrıca, zemin olarak bir platformunuz varsa, NPC'nin ayakta kalabilmesi için en az bir katı bloğunuz olmalıdır. Bu katı blok doğrudan sol veya sağ yan duvarlara bitişik olamaz . Bunların hepsi girişli geçerli evler:

    ############
    #**********#
    |**********#
    #**********#
    #**********|
    ############  (Multiple doors, or doors up high are okay)
    
    ############
    #**********#
    #**********#
    #**********#
    #**********#
    #######----#
    
    #----#######
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
  4. Daha fazlasına izin verilse de , en az bir ışık kaynağı $, masa Tve sandalye olmalıdır C. Işık kaynağı havada veya yerde olabilir, ancak masa ve sandalye her ikisi de yerde, örneğin en alt sırada olmalıdır.

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

    Ayrıca, herhangi bir mobilyanın arkasında bir duvar olduğunu varsayabilirsiniz, böylece bir meşale, sandalye veya masa iki delik arasında bir ayırıcı olarak sayılabilir.

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

Meydan okuma

Bir evi ASCII dizesi olarak alan ve geçerli konut olsa da olmasa da true / false döndüren en kısa işlevi yazmalısınız. Bunu, yeni satırla ayrılmış bir dize, bir dize listesi veya makul olduğu sürece başka bir yol olarak alabilirsiniz. Benim için, lütfen kısa bir program ekleyin, böylece doğru çalışıp çalışmadığını test edebilirim.

Referans olarak, bunların tümü geçersiz girişlerdir:

############
-**********#
-****$*****#
-**********#
-******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.)

Liderler Sıralaması


6
Harika bir meydan okuma, Terraria sevgilisi.
Rɪᴋᴇʀ

Deliklerin dikdörtgen olacağını varsayabilir miyiz? Aksi takdirde, bütünün 4x4'e sığmadığı, ancak art arda 4'ten fazla boşluk içermediği bir test durumu kullanılabilir.
Martin Ender

Belirsiz bulduğum birçok nokta var. 1. Çerçeve dikdörtgen olmalı mı? " tüm evler dikdörtgen olacak " diyorlar, ancak dikdörtgen olmayan ancak eksenle hizalanan sınırlama kutularının dört köşesine de giden çerçeveleri açıkça dışlamıyorlar. Ve muhtemelen delikler çevrelenebilir #. 2. Martin'in dediği gibi, " hiçbir delik 4x4'ten büyük olamaz " tam olarak ne anlama gelir? (Ayrıca, üçüncü okumaya kadar deliğin ne olduğunu anladığımdan emin olmadığımı da unutmayın. Oyunu oynamamış insanlar için spesifikasyonu yazmalısınız).
Peter Taylor

1
3. " Bu katı blok doğrudan duvarlara bitişik olamaz " - duvar nedir? 2. noktadan itibaren öyle görünüyor *, ancak bu geçerli kapıların verilen örneklerini hariç tutacaktır. 4. " Yerde ", sondan bir önceki satırda "veya" a'nın üstünde "anlamına mı geliyor #? 5. " Bu, masa ve sandalyeler için geçerli değildir. " Bu, bir Tveya Cdoğrudan altındaki 4x4 deliğin çok büyük olduğu anlamına mı geliyor? 6. " NPC tek girişler köşede olduğu için giremez " Ben spec köşeleri hakkında bir şey söyledi sanmıyorum. Onlar olabilir -ya da |başka kapılar varsa?
Peter Taylor

7. Bir köşedeki girişler, erişimi kabul etmedikleri için sorun teşkil ediyorsa, bu, her birinin *bir girişten erişilebilir olması gerektiği anlamına mı gelir? Yoksa *izin verilen deliklerin ortasında, tüm odayı ikiye kesen delikler, sadece bir tarafı girişe izin verilir ve girişler doğrudan bir deliğe girer mi?
Peter Taylor

Yanıtlar:


2

Python 2, 503 439 bayt

Süper kısa değil, ama bu bir çözüm. Golf için bir şey görürseniz bana bildirin. Aslında okunabilir olmadığından, ungolfed versiyonuma da bakmanızı tavsiye ederim.

Düzenleme: ifBir döngü dışındaki tüm s en altta birleştirilmiştir.

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

Çevrimiçi deneyin

Ungolfed:

Ayrıca False, hata ayıklama amacıyla sonucun nedenini çıkarır.

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

Ungolfed versiyonu çevrimiçi

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.