Kann ich hier wohnen

16

Im Spiel Terraria besteht eine der Spielmechanismen darin, Häuser zu bauen, damit ein NPC einziehen kann. Es gibt strenge Regeln, was als gültiges Haus gilt oder nicht. Hier ist die Liste der Regeln:

  1. Die Gesamtfläche im Haus muss mindestens 60 Quadratmeter, jedoch weniger als 750 Quadratmeter betragen. Außerdem muss die Größe des Hauses einschließlich des äußeren Rahmens mindestens einer der folgenden Werte sein:

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

    Der Einfachheit halber können Sie davon ausgehen, dass: a) alle Eingabehäuser Rechtecke sind und b) sich keine festen Kacheln #im Inneren des Hauses befinden. Hier ist unser 12x6-Frame (gezeichnet in wunderschönem ASCII):

    ############
    #          #
    #          #
    #          #
    #          #
    ############
    
  2. Das Haus muss mit Hintergrundwänden bedeckt sein. Dies sind keine massiven Fliesen, sondern eine Wand hinter dem Haus in der dritten Dimension. Löcher sind erlaubt, aber keine Löcher dürfen größer als 4x4 sein. Wenn eine Zeile oder Spalte aus 5 oder mehr Leerzeichen besteht, ist dies ein Loch, das größer als 4x4 ist, und das Haus ist ungültig. Mehrfachbohrungen sind ebenfalls zulässig, es muss jedoch mindestens ein Wandabstand eingehalten werden.

    ############
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
    ############
    #*    *    #
    #*    *    #
    #*    *    #
    #******    #
    ############  (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. Es muss einen Eingang geben. Dies kann eine Tür |an den Seiten oder eine Plattform -am Boden oder an der Decke sein. Wenn sich der einzige Eingang an einer Ecke befindet, kann der NPC nicht eintreten. Wenn Sie eine Plattform als Boden haben, müssen Sie mindestens einen einzigen festen Block haben, auf dem der NPC stehen kann. Dieser massive Block kann nicht direkt an die Seitenwände links oder rechts angrenzen . Dies sind alles gültige Häuser mit Eingängen:

    ############
    #**********#
    |**********#
    #**********#
    #**********|
    ############  (Multiple doors, or doors up high are okay)
    
    ############
    #**********#
    #**********#
    #**********#
    #**********#
    #######----#
    
    #----#######
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
  4. Es muss mindestens eine Lichtquelle $, ein Tisch Tund ein Stuhl vorhanden sein C, obwohl mehr zulässig sind. Die Lichtquelle kann sich in der Luft oder auf dem Boden befinden, aber der Tisch und der Stuhl müssen sich beide auf dem Boden befinden, z. B. in der untersten Reihe.

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

    Sie können auch davon ausgehen, dass sich hinter jedem Möbel eine Wand befindet, sodass eine Taschenlampe, ein Stuhl oder ein Tisch als Trennelement zwischen zwei Löchern gelten kann.

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

Die Herausforderung

Sie müssen die kürzeste Funktion schreiben, die ein Haus als ASCII-Zeichenfolge annimmt und true / false zurückgibt, unabhängig davon, ob es sich um ein gültiges Gehäuse handelt. Sie können diese Zeichenfolge als durch Zeilenumbrüche getrennte Zeichenfolge, als Liste von Zeichenfolgen oder auf andere Weise verwenden, sofern dies sinnvoll ist. Bitte fügen Sie mir ein kurzes Programm bei, damit ich testen kann, ob es richtig funktioniert oder nicht.

Als Referenz sind dies alles ungültige Eingaben:

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

Bestenliste

DJMcMayhem
quelle
6
Coole Herausforderung, Terraria-Liebhaber.
30.
Können wir davon ausgehen, dass die Löcher rechteckig sind? Andernfalls könnte dies einen Testfall verwenden, bei dem das Ganze nicht in 4x4 passt, aber niemals mehr als 4 Leerzeichen in einer Reihe enthält.
Martin Ender
Es gibt viele Punkte, die ich unklar finde. 1. Muss der Rahmen rechteckig sein? " Alle Häuser werden Rechtecke sein " schlägt dies vor, schließt jedoch Rahmen nicht eindeutig aus, die nicht rechteckig sind, sondern in alle vier Ecken ihres achsenausgerichteten Begrenzungsrahmens hineinragen. Und möglicherweise können Löcher von umgeben sein #. 2. Wie Martin gefragt hat, was genau bedeutet " keine Löcher können größer als 4x4 sein "? (Beachten Sie auch, dass ich erst bei meinem dritten Durchlesen sicher war, was das Loch war. Sie sollten die Spezifikation für Leute schreiben, die das Spiel nicht gespielt haben.)
Peter Taylor
1
3. " Dieser massive Block kann nicht direkt an die Wände angrenzen " - Was ist eine Wand? Ab Punkt 2 scheint es so zu sein *, aber das würde die angegebenen Beispiele für gültige Türen ausschließen. 4. Bedeutet " am Boden " "in der vorletzten Reihe" oder "über a #"? 5. " Dies gilt nicht für Tisch und Stühle. " Bedeutet das also, dass ein 4x4-Loch mit einem Toder Cdirekt darunter zu groß ist? 6. " NPC kann nicht eintreten, weil die einzigen Eingänge an der Ecke sind " Ich glaube nicht, dass die Spezifikation etwas über die Ecken gesagt hat. Darf es sein -oder |wenn es andere Türen gibt?
Peter Taylor
7. Wenn Eingänge an einer Ecke ein Problem darstellen, weil sie keinen Zugang zulassen, bedeutet dies, dass jeder *von einem Eingang aus erreichbar sein muss? Oder sind einzelne *Löcher in der Mitte erlaubt, Löcher, die den gesamten Raum in zwei Hälften schneiden, wobei nur eine Seite einen Zugang hat, und Eingänge, die direkt in ein Loch führen, erlaubt?
Peter Taylor

Antworten:

2

Python 2, 503 439 Bytes

Nicht sehr kurz, aber es ist eine Lösung. Lass es mich wissen, wenn du etwas zum Golfen siehst. Ich würde empfehlen, auch meine ungolfed-Version anzuschauen, da sie tatsächlich lesbar ist.

Bearbeiten: Alle ifs außerhalb einer Schleife wurden unten kombiniert.

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

Probieren Sie es online aus

Ungolfed:

Gibt auch den Grund für das Ergebnis Falsezum Debuggen aus.

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 Version online

mbomb007
quelle