Posso vivere qui?


16

Nel gioco Terraria , una delle meccaniche di gioco prevede la costruzione di case in modo che un NPC possa spostarsi. Esiste una rigida serie di regole per ciò che conta o meno come casa valida. Ecco l'elenco delle regole:

  1. L'area totale della casa deve essere di almeno 60 piastrelle quadrate, ma inferiore a 750. Inoltre, le dimensioni della casa, incluso il telaio esterno, devono essere almeno una di queste:

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

    per semplicità, puoi tranquillamente supporre che: a) Tutte le case di input saranno rettangolari eb) nessuna piastrella solida #sarà all'interno della casa. Ecco la nostra cornice 12x6 (disegnata nella bellissima ASCII):

    ############
    #          #
    #          #
    #          #
    #          #
    ############
    
  2. La casa deve essere coperta da pareti di fondo. Queste non sono piastrelle solide, ma piuttosto un muro dietro la casa nella terza dimensione. I fori sono consentiti, ma nessun foro può essere più grande di 4x4. Se c'è una riga o una colonna di 5 o più caratteri di spazio in una riga, questo è un buco più grande di 4x4 e la casa non è valida. Sono ammessi anche più fori, ma deve esserci almeno una parete a parte.

    ############
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
    ############
    #*    *    #
    #*    *    #
    #*    *    #
    #******    #
    ############  (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. Ci deve essere un ingresso. Questa può essere una porta |ai lati o una piattaforma -sul pavimento o sul soffitto. Se l'unico ingresso è in un angolo, l'NPC non è in grado di entrare. Inoltre, se si dispone di una piattaforma come pavimento, è necessario disporre di almeno un singolo blocco solido affinché l'NPC sia in piedi. Questo blocco solido non può essere direttamente adiacente alle pareti laterali a sinistra o a destra. Queste sono tutte case valide con ingressi:

    ############
    #**********#
    |**********#
    #**********#
    #**********|
    ############  (Multiple doors, or doors up high are okay)
    
    ############
    #**********#
    #**********#
    #**********#
    #**********#
    #######----#
    
    #----#######
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
  4. Ci deve essere almeno una fonte di luce $, tavolo Te sedia C, anche se è permesso di più. La sorgente luminosa può essere in aria o a terra, ma sia il tavolo che la sedia devono trovarsi a terra, ad es. Nella fila più bassa.

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

    Inoltre, puoi presumere che ci sia un muro dietro qualsiasi mobile, quindi una torcia, una sedia o un tavolo possono contare come un separatore tra due fori.

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

La sfida

È necessario scrivere la funzione più breve che accetta una casa come stringa ASCII e restituisce true / false indipendentemente dal fatto che sia valida o meno. Puoi prenderlo come una stringa delimitata da nuova riga, un elenco di stringhe o in qualsiasi altro modo purché sia ​​ragionevole. Per amor mio, ti preghiamo di includere un breve programma in modo da poter verificare se funziona bene o no.

Per riferimento, questi sono tutti input non validi:

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

Classifica


6
Sfida interessante, amico di Terraria.
Rɪᴋᴇʀ

Possiamo supporre che i fori saranno rettangolari? Altrimenti questo potrebbe usare un caso di test in cui il tutto non si adatta a 4x4 ma che non contiene mai più di 4 spazi di fila.
Martin Ender,

Ci sono molti punti che trovo poco chiari. 1. La cornice deve essere rettangolare? " Tutte le case saranno rettangoli " suggerisce che lo fanno, ma non esclude chiaramente cornici che non sono rettangolari ma vanno in tutti e quattro gli angoli del loro riquadro di delimitazione allineato agli assi. E forse i buchi possono essere circondati #. 2. Come ha chiesto Martin, cosa significa esattamente " nessun foro può essere più grande di 4x4 "? (Nota anche che non è stato fino al mio terzo read-through che ero certo di capire quale fosse il buco. Dovresti scrivere le specifiche per le persone che non hanno giocato al gioco).
Peter Taylor,

1
3. " Questo blocco solido non può essere direttamente adiacente alle pareti " - che cos'è un muro? Dal punto 2 sembra esserlo *, ma ciò escluderebbe gli esempi forniti di porte valide. 4. " a terra " significa "nella penultima fila" o "sopra a #"? 5. " Questo non vale per tavolo e sedie. " Quindi significa che un buco 4x4 con una To Cdirettamente sotto di esso è troppo grande? 6. "L' NPC non può entrare perché gli unici ingressi sono all'angolo " Non credo che le specifiche abbiano detto nulla sugli angoli. Possono essere -o |se ci sono altre porte?
Peter Taylor,

7. Se gli ingressi in un angolo sono un problema perché non ammettono l'accesso, significa che ognuno *deve essere raggiungibile da un ingresso? O sono *consentiti gli isolamenti nel mezzo dei fori, i fori che tagliano l'intera stanza in due con un solo lato a cui è consentito un ingresso e gli ingressi che vanno direttamente in un foro?
Peter Taylor,

Risposte:


2

Python 2, 503 439 byte

Non molto breve, ma è una soluzione. Fammi sapere se vedi qualcosa da golf. Consiglio di guardare anche la mia versione non golfata, dato che in realtà è leggibile.

Modifica: tutti ifi messaggi esterni a un ciclo sono stati combinati in fondo.

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

Provalo online

Ungolfed:

Emette anche il motivo per cui il risultato è False, a fini di debug.

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

Versione Ungolfed online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.