क्या मैं यहाँ रह सकता हूँ?


16

गेम टेरारिया में , खेल मैकेनिकों में से एक में घरों का निर्माण करना शामिल है ताकि एक एनपीसी अंदर जा सके। वैध घर के रूप में गिना जाता है या नहीं, इसके लिए नियमों का एक सख्त सेट है। यहाँ नियमों की सूची है:

  1. घर में कुल क्षेत्रफल कम से कम 60 वर्ग टाइल होना चाहिए, लेकिन 750 से कम होना चाहिए। इसके अलावा, बाहरी फ्रेम सहित घर का आकार इनमें से कम से कम एक होना चाहिए:

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

    सादगी के लिए, आप सुरक्षित रूप से मान सकते हैं कि: ए) सभी इनपुट हाउस आयत होंगे, और बी) कोई भी ठोस टाइल #घर के अंदर नहीं होगी। यहाँ हमारे 12x6 फ्रेम (सुंदर ASCII में खींचा गया है):

    ############
    #          #
    #          #
    #          #
    #          #
    ############
    
  2. घर को पृष्ठभूमि की दीवारों में कवर किया जाना चाहिए। ये ठोस टाइल नहीं हैं, बल्कि तीसरे आयाम में घर के पीछे की दीवार है । छेद की अनुमति है, लेकिन कोई भी छेद 4x4 से बड़ा नहीं हो सकता है। यदि पंक्ति में 5 या अधिक स्थान वर्णों की एक पंक्ति या स्तंभ है, तो यह 4x4 से बड़ा छेद है, और घर अमान्य है। कई छेदों की भी अनुमति है, लेकिन कम से कम एक दीवार अलग होनी चाहिए।

    ############
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
    ############
    #*    *    #
    #*    *    #
    #*    *    #
    #******    #
    ############  (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. एक प्रवेश द्वार होना चाहिए। यह |पक्षों पर एक दरवाजा या -फर्श या छत पर एक मंच हो सकता है । यदि केवल प्रवेश द्वार एक कोने पर है, तो एनपीसी प्रवेश करने में असमर्थ है। इसके अलावा, यदि आपके पास फर्श के रूप में एक मंच है, तो आपके पास एनपीसी के लिए कम से कम एक ठोस ब्लॉक होना चाहिए। इस ठोस ब्लॉक को सीधे बाईं ओर या दाईं ओर की दीवारों से सटे नहीं किया जा सकता है । ये प्रवेश द्वार वाले सभी वैध घर हैं:

    ############
    #**********#
    |**********#
    #**********#
    #**********|
    ############  (Multiple doors, or doors up high are okay)
    
    ############
    #**********#
    #**********#
    #**********#
    #**********#
    #######----#
    
    #----#######
    #**********#
    #**********#
    #**********#
    #**********#
    ############
    
  4. कम से कम एक प्रकाश स्रोत $, मेज Tऔर कुर्सी होनी चाहिए C, हालांकि अधिक की अनुमति है। प्रकाश स्रोत हवा में या जमीन पर हो सकता है, लेकिन मेज और कुर्सी दोनों को जमीन पर होना चाहिए, जैसे सबसे कम पंक्ति पर।

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

    इसके अलावा, आप यह मान सकते हैं कि किसी भी फर्नीचर के पीछे एक दीवार है, इसलिए एक मशाल, कुर्सी या मेज दो छेदों के बीच विभाजक के रूप में गिना जा सकता है।

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

चुनौती

आपको सबसे छोटा फ़ंक्शन लिखना चाहिए जो ASCII स्ट्रिंग के रूप में एक घर लेता है, और यह सही है कि क्या यह वैध आवास है या नहीं। जब तक यह वाजिब हो तब तक आप इसे न्यूलाइन सीमांकित स्ट्रिंग, स्ट्रिंग्स की सूची या किसी अन्य तरीके से ले सकते हैं। मेरी खातिर, एक छोटा कार्यक्रम शामिल करें ताकि मैं यह जांच कर सकूं कि यह सही है या नहीं।

संदर्भ के लिए, ये सभी अमान्य इनपुट हैं:

############
-**********#
-****$*****#
-**********#
-******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. जैसा कि मार्टिन ने पूछा, क्या वास्तव में " कोई छेद 4x4 से बड़ा नहीं हो सकता है "? (यह भी ध्यान दें कि यह तब तक नहीं था जब तक कि मेरा तीसरा पढ़ा-लिखा माध्यम नहीं था, मैं समझ गया था कि छेद क्या है। आपको उन लोगों के लिए कल्पना लिखनी चाहिए जिन्होंने खेल नहीं खेला है)।
पीटर टेलर

1
3. " यह ठोस ब्लॉक सीधे दीवारों से सटा नहीं हो सकता है " - एक दीवार क्या है? बिंदु 2 से यह प्रतीत होता है *, लेकिन यह वैध दरवाजे के दिए गए उदाहरणों को बाहर करेगा। 4. क्या " जमीन पर " का अर्थ "प्रथागत पंक्ति में" या "ऊपर #" है? 5. " यह टेबल और कुर्सियों पर लागू नहीं होता है। " तो क्या इसका मतलब यह है कि 4x4 छेद एक Tया Cइसके नीचे सीधे बहुत बड़ा है? 6. " एनपीसी प्रवेश नहीं कर सकता क्योंकि केवल प्रवेश द्वार कोने में हैं " मुझे नहीं लगता कि कल्पना ने कोनों के बारे में कुछ भी कहा। क्या वे हो सकते हैं -या |यदि अन्य दरवाजे हैं?
पीटर टेलर

7. यदि एक कोने पर प्रवेश द्वार एक समस्या है क्योंकि वे प्रवेश स्वीकार नहीं करते हैं, तो क्या इसका मतलब है कि प्रत्येक *को प्रवेश द्वार से पहुंच योग्य होना चाहिए? या *अनुमति दी गई छेद के बीच में छेद किया जाता है, छेद जो पूरे कमरे को दो में काटता है जिसमें केवल एक तरफ एक प्रवेश की अनुमति होती है, और प्रवेश द्वार जो सीधे एक छेद में जाते हैं?
पीटर टेलर

जवाबों:


2

पायथन 2, 503 439 बाइट्स

सुपर शॉर्ट नहीं है, लेकिन यह एक समाधान है। मुझे पता है कि आप गोल्फ के लिए कुछ देखते हैं। मैं अपने ungolfed संस्करण को देखने की सलाह दूंगा, क्योंकि यह वास्तव में पठनीय है।

संपादित करें: ifलूप के बाहर के सभी एस को नीचे की ओर जोड़ दिया गया है।

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

इसे ऑनलाइन आज़माएं

Ungolfed:

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

Ungolfed संस्करण ऑनलाइन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.