ฉันอยู่ที่นี่ได้ไหม


16

ในTerrariaเกมหนึ่งในกลไกของเกมเกี่ยวข้องกับการสร้างบ้านเพื่อให้ NPC สามารถเข้าได้มีกฎที่เข้มงวดสำหรับสิ่งที่นับว่าเป็นเฮ้าส์ที่ถูกต้องหรือไม่ นี่คือรายการของกฎ:

  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. จะต้องมีทางเข้า นี่อาจเป็นประตู|ด้านข้างหรือแพลตฟอร์ม-บนพื้นหรือเพดาน หากทางเข้าเพียงแห่งเดียวอยู่ในมุมหนึ่ง NPC จะไม่สามารถเข้าได้ นอกจากนี้หากคุณมีแพลตฟอร์มเป็นพื้นคุณจะต้องมีบล็อกที่เป็นของแข็งอย่างน้อยหนึ่งบล็อกเพื่อให้ NPC สามารถยืนได้ บล็อกทึบนี้ไม่สามารถติดกับผนังด้านข้างทางด้านซ้ายหรือด้านขวาได้โดยตรง เหล่านี้เป็นบ้านที่ถูกต้องทั้งหมดที่มีทางเข้า:

    ############
    #**********#
    |**********#
    #**********#
    #**********|
    ############  (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
ความท้าทายที่ยอดเยี่ยมคนรัก Terraria เพื่อน
Rɪᴋᴇʀ

เราสามารถสมมติว่าหลุมนั้นจะเป็นรูปสี่เหลี่ยมผืนผ้าได้หรือไม่? มิฉะนั้นกรณีนี้อาจใช้กรณีทดสอบที่ไม่เหมาะกับขนาด 4x4 แต่ไม่เคยมีช่องว่างมากกว่า 4 ช่องในหนึ่งแถว
Martin Ender

มีหลายจุดที่ฉันพบว่าไม่ชัดเจน 1. เฟรมต้องเป็นสี่เหลี่ยมหรือไม่? " บ้านทุกหลังจะเป็นรูปสี่เหลี่ยมผืนผ้า " แสดงให้เห็นว่าพวกเขาทำ แต่ไม่ได้แยกออกอย่างชัดเจนกรอบที่ไม่ใช่รูปสี่เหลี่ยมผืนผ้า แต่เข้าไปในทั้งสี่มุมของกล่องขอบเขตที่จัดแนวแกนของพวกเขา และอาจเป็นไปได้ที่จะล้อมรอบไปด้วย#รู 2. ตามที่มาร์ตินถามว่า " ไม่มีหลุมใดที่สามารถใหญ่กว่า 4x4 " ได้หมายความว่าอะไร? (โปรดทราบว่ามันยังไม่ถึงจนกว่าจะมีการอ่านครั้งที่สามของฉันที่ฉันมั่นใจว่าหลุมคืออะไรคุณควรเขียนสเป็คสำหรับผู้ที่ไม่ได้เล่นเกม)
Peter Taylor

1
3. " บล็อกทึบนี้ไม่สามารถติดกับผนังโดยตรง " - กำแพงคืออะไร จากจุดที่ 2 ดูเหมือนว่าจะเป็น*แต่นั่นจะไม่รวมตัวอย่างของประตูที่ถูกต้อง 4. " บนพื้นดิน " หมายถึง "ในแถวสุดท้าย" หรือ "เหนือ#" 5. " สิ่งนี้ใช้ไม่ได้กับโต๊ะและเก้าอี้ " นั่นหมายความว่าหลุม 4x4 ที่มีTหรือCต่ำกว่านั้นใหญ่เกินไปหรือไม่ 6. " NPC เข้าไม่ได้เพราะมีทางเข้าเพียงทางเดียว " ฉันไม่คิดว่าสเป็คพูดอะไรเกี่ยวกับมุม พวกเขาอาจเป็น-หรือ|ถ้ามีประตูอื่น ๆ ?
Peter Taylor

7. ถ้าทางเข้ามุมเป็นปัญหาเพราะพวกเขาไม่ยอมรับการเข้าถึงนั่นหมายความว่าแต่ละคน*ต้องเข้าถึงได้จากทางเข้าหรือไม่? หรืออยู่โดดเดี่ยว*กลางรูที่อนุญาตให้รูที่ตัดทั้งห้องเป็นสองห้องโดยมีด้านเดียวเท่านั้นที่อนุญาตให้มีทางเข้าและทางเข้าที่อนุญาตให้เข้าไปในรูได้โดยตรง?
Peter Taylor

คำตอบ:


2

Python 2, 503 439 ไบต์

ไม่สั้นมาก แต่มันเป็นทางออก แจ้งให้เราทราบหากคุณเห็นบางสิ่งที่จะเล่นกอล์ฟ ฉันขอแนะนำให้ดูที่เวอร์ชันที่ไม่ดีของฉันด้วยเช่นกันเนื่องจากสามารถอ่านได้จริง

แก้ไข: ifs ทั้งหมดนอกวงได้รับการรวมที่ด้านล่าง

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

เวอร์ชั่นออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.