เข้าร่วมห้อง


15

นี่คือแผนที่สมมุติว่าเป็นคุกใต้ดิน ...

##########
#    #####
#    #####
##########
##########
##########
##########
####    ##
####    ##
##########

สมมติว่าฮีโร่นั้นอยู่ในห้อง A (ที่มุมบนซ้าย) และเป้าหมายของพวกเขา (เจ้าชายในความทุกข์?) อยู่ในห้อง B (ไปทางขวาล่าง) แผนที่ของเราไม่อนุญาตให้ฮีโร่ก้าวหน้าไปสู่เป้าหมาย

เราต้องเพิ่มทางเดิน ...

##########
#    #####
#    #####
####.#####
####.#####
####.#####
####.#####
####    ##
####    ##
##########

ที่นั่นดีกว่ามาก!


กฎระเบียบ

  • โปรแกรมหรือฟังก์ชันที่รับแผนที่ดันเจี้ยน (ประกอบด้วยแฮชและช่องว่างโดยมีแถวคั่นด้วยอักขระบรรทัดใหม่)
  • มันจะส่งออกแผนที่ที่มีจุดเพิ่มเพื่อแสดงถึงข้อความในช่องว่างทั้งหมดซึ่งอยู่บนเส้นทางโดยตรงระหว่างอักขระช่องว่าง
  • มันจะไม่เปลี่ยนความยาวบรรทัดหรือจำนวนบรรทัด
  • ข้อความทั้งหมดอยู่ในสายตรงจากช่องว่างไปยังช่องว่าง
    • ทางเดินไม่สามารถหมุนมุมได้
    • พวกเขาจะไม่อยู่ระหว่างช่องว่างและขอบของแผนที่
  • ใช้ภาษาใดก็ได้
  • พยายามทำการแปลงเป็นไบต์ที่น้อยที่สุด
  • หากไม่สามารถลากทางผ่านให้ส่งคืนแผนที่โดยไม่มีการเปลี่ยนแปลง
  • แผนที่ควรมีแฮชรอบ ๆ ขอบทุกครั้ง (คุณไม่จำเป็นต้องจัดการช่องว่างที่ขอบ)
  • แม็พอินพุตมักเป็นสี่เหลี่ยมเสมอแต่ละแถวควรมีความกว้างเท่ากัน

กรณีทดสอบ

####       ####
#  #   =>  #  #
#  #       #  #
####       ####

##########        ##########
#    #####        #    #####
#    #####        #    #####
##########        ####.#####
##########    =>  ####.#####
##########        ####.##### 
##########        ####.#####
####    ##        ####    ##
####    ##        ####    ##
##########        ##########

##########        ##########
#    #####        #    #####
#    #####        #    #####
##########        ##########
##########    =>  ##########
##########        ########## 
##########        ##########
######  ##        ######  ##
######  ##        ######  ##
##########        ##########

##########        ##########
#    #####        #    #####
#    #####        #    #####
##########        ####.#####
##########    =>  ####.#####
####   ###        ####   ### 
##########        ######.###
######  ##        ######  ##
######  ##        ######  ##
##########        ##########

##########        ##########
#    #####        #    #####
#    #####        #    #####
##########        ##..######
##########    =>  ##..######
##########        ##..###### 
##########        ##..######
## #######        ## .######
##  ######        ##  ######
##########        ##########

##########        ##########
#    #####        #    #####
#    #####        #    #####
##########        #.########
##########    =>  #.########
##########        #.######## 
#######  #        #.#####  #
#######  #        #.#####  #
# #####  #        # .....  #
##########        ##########

##########        ##########
#    #####        #    #####
#    #####        #    #####
##########        #.########
#####  ###    =>  #.###  ###
#####  ###        #.###  ### 
#######  #        #.#####  #
#######  #        #.#####  #
# #####  #        # .....  #
##########        ##########

##########        ##########
##       #        ##       #
##########        ##......##
##########        ##......##
##########    =>  ##......##
##########        ##......## 
##########        ##......##
##########        ##......##
#       ##        #       ##
##########        ##########

##########        ##########
####  ####        ####  ####
####### ##        ####..# ##
###### ###        ####.. ###
# ### ## #    =>  # ... .. #
# ## ### #        # .. ... # 
### ######        ### ..####
## #######        ## #..####
####  ####        ####  ####
##########        ##########

ฉันสามารถใช้ตัวละครต่างไปจาก#และ.?
user202729

1
@ user202729 ไม่ มันอยู่ในกฎตั้งแต่เริ่มต้นและมันก็มีคำตอบเดียวอยู่แล้ว อาจดีที่สุดที่จะปล่อยให้สอดคล้องกัน
AJFaraday

@ user202729 กรณีทดสอบที่คุณแนะนำนั้นคล้ายคลึงกับกรณีสุดท้ายของฉัน ฉันอาจเพิ่มเมื่อฉันเปลี่ยนคำถามต่อไป แต่มันไม่เพิ่มมาก
AJFaraday

... ฉันไม่ได้เลื่อนลง ไม่มีปัญหา.
user202729

@ l4m2 ใช้กฎเดียวกันทุกที่ที่มีเส้นตรงระหว่างห้องเป็นทางผ่าน ห้องรูปตัวยูจะมีช่องว่างที่เต็มไปด้วยทางเดิน
AJFaraday

คำตอบ:


7

เยลลี่ขนาด 17 ไบต์

ỴḲaLḊṖƊ¦”.KƊ€Z$⁺Y

ลองออนไลน์!

หากิน -1 ขอบคุณที่user202729

คำอธิบาย:

ỴḲaLḊṖƊ¦”.KƊ€Z$⁺Y Arguments: S
Ỵ                 Split S on newlines
 ḲaLḊṖƊ¦”.KƊ€Z$   Monadic link
 ḲaLḊṖƊ¦”.KƊ€      Map over left argument
 ḲaLḊṖƊ¦”.KƊ        Monadic link
 Ḳ                   Split on spaces
  aLḊṖƊ¦”.           Dyadic link with right argument '.'
  aLḊṖƊ¦              Apply at specific indices
  a                    Logical AND (vectorizes)
   LḊṖƊ                Monadic link
   L                    Length
    Ḋ                   Range [2..n]
     Ṗ                  Remove last element
          K          Join with spaces
             Z     Zip
               ⁺  Previous link
                Y Join with newlines

2
มันทำให้ฉันประหลาดใจเสมอว่าผู้คนสามารถเผชิญกับความท้าทายเหล่านี้ได้เร็วแค่ไหนและในตัวละครเพียงไม่กี่ตัว
AJFaraday

@AJFaraday ดีแล้วคุณก็สามารถเป็นส่วนหนึ่งของมันได้เช่นกัน :) เพียงแค่เริ่มต้นด้วยภาษากอล์ฟแบบกองซ้อน (เช่น CJam, 05AB1E) และทำงานในแบบของคุณ
Erik the Outgolfer

มันดูเหมือนจะไกลเกินกว่าที่ฉันจะซื่อสัตย์ แต่ฉันชอบที่จะเห็นวิธีการทำงาน
AJFaraday

7
เดี๋ยวก่อน TNB ย่อมาจาก 'tea and biscuits' หรือไม่? หรือตอนนี้ฉันจะเป็นซุปเปอร์อังกฤษ
AJFaraday

5
คำอธิบายจะเจ๋งสำหรับคำตอบนี้
Tamás Sengel



3

Haskell , 209 165 162 ไบต์

import Data.List
t=transpose
k=concat
j a=(foldr1 max<$>)<$>t<$>t[a,f<$>a,t$f<$>t a]
f b|(e:g:d@(h:_:_))<-group b=k[f$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$b

ลองออนไลน์!

ไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการทำใน Haskell ฉันแน่ใจ มันมีวงเล็บมากเกินไปสำหรับความชอบของฉัน แต่ฉันไม่แน่ใจว่าจะลบอีกต่อไปได้อย่างไร


2
ยินดีต้อนรับสู่เว็บไซต์! คุณสามารถลดวงเล็บบางส่วนได้โดยใช้$( (k(take 2 c))กลายเป็น(k$take 2 c)) คุณยังสามารถใช้!!0แทนheadในบางกรณี
โพสต์ร็อค Garf Hunter

ที่จริงแล้วในกรณีของ(k(take 2 c))คุณสามารถลบวงเล็บด้านนอกออกได้โดยไม่จำเป็นต้องใช้ แต่ในกรณีที่drop(length(head d))คุณยังคงสามารถใช้งานได้ให้$แทนที่ด้วยdrop(length$head d)(และแม้กระทั่งdrop(length$d!!0) )
โพสต์ร็อค Garf Hunter

นอกจากนี้หากคุณใช้kแทนคุณ++จะสามารถลดบรรทัดสุดท้ายได้อย่างมาก k[' '<$k(take 2 c),'.'<$d!!0,drop(length$d!!0)$f$k$d].
โพสต์ Rock Garf Hunter

หนึ่งกอล์ฟที่ผ่านมาบรรทัดสุดท้ายสามารถถูกแทนที่ด้วยf b|(e:g:d@(h:_:_))<-group b=k[' '<$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$bสิ่งนี้ใช้รูปแบบการจับคู่เพื่อทำการยกน้ำหนักจำนวนมากที่เคยทำมาก่อน
โพสต์ Rock Garf Hunter

1
ขอบคุณสำหรับการตีกอล์ฟที่หนักหน่วง @ user56656! Ungolfed ฉันมี f เป็น 2 ฟังก์ชั่นและเพียงแค่วางพวกเขาเข้าด้วยกันโดยไม่ต้องปรับให้เหมาะสมโดยรวม นั่นเป็นสิ่งที่ดีที่ต้องจำไว้
aoemica


2

เรติน่า 0.8.2 , 95 ไบต์

+`(?<=(.)*)#(?=.*¶(?>(?<-1>.)*)[ .])
.
+`\.(?=(.)*)(?<![ .](?>(?<-1>.)*)¶.*)
#
 (\S+) 
 $.1$*. 

ลองออนไลน์!คำอธิบาย:

+`(?<=(.)*)#(?=.*¶(?>(?<-1>.)*)[ .])
.

สิ่งนี้จะมองหา#สัญญาณที่อยู่เหนือช่องว่างหรือ.จุดและเปลี่ยนเป็นจุดจนกว่าจะไม่มีใครเหลือ lookbehind พบ#'s คอลัมน์แล้วข้าม lookahead ยังบรรทัดถัดไปและอะตอมในคอลัมน์เดียวกันด้านล่างเพื่อให้พื้นที่หรือสามารถตรงกับถ้ามันเป็นสิ่งดังต่อไปนี้.#

+`\.(?=(.)*)(?<![ .](?>(?<-1>.)*)¶.*)
#

นี่จะมองหา.s ที่ไม่อยู่ใต้ช่องว่างหรือ.s แล้วเปลี่ยนกลับเป็น#s จนกว่าจะไม่มีใครเหลือ Lookahead ค้นหา.คอลัมน์ของจากนั้น lookbehind ข้ามไปยังบรรทัดก่อนหน้าและแบบอะตอมไปยังคอลัมน์เดียวกันด้านบนในลักษณะเดียวกันเพื่อให้พื้นที่หรือ.#สามารถตรงกับถ้ามันเป็นสิ่งดังกล่าวข้างต้น Lookbehind เชิงลบจะถูกใช้เพื่อให้สิ่งนี้ใช้ได้กับ.s ในแถวบนสุดด้วย

 (\S+) 
 $.1$*. 

(หมายเหตุท้ายพื้นที่บนทั้งสองเส้น) นี้เพียงแค่รูปลักษณ์สำหรับการทำงานทั้งหมดของตัวละครที่ไม่ใช่ช่องว่างระหว่างช่องว่างและเพื่อให้แน่ใจว่าพวกเขาทั้งหมด.s



1

ฉันเกรงว่าลิงก์ดีบักของคุณจะแสดงรหัสเปล่า
AJFaraday

@AJFaraday: เบราว์เซอร์ใดที่คุณใช้อยู่ มันใช้งานได้สำหรับฉันบน Chrome สำหรับ Windows
เรียกซ้ำ

1

JavaScript (Node.js) , 205 193 190 186 181 175 172 ไบต์

r=>r.split`
`.map(x=>[...x]).map((R,y,r)=>R.map((c,x)=>{for(D=2;c<"#"&&D--;){for(;(T=(r[y+=D]||0)[x+=!D])>" ";);for(;r[y-=D][x-=!D]>c;)T?r[y][x]=".":0}})&&R.join``).join`
`

ลองออนไลน์!

แสดงความคิดเห็น

f=r=>r.split`
` ->                                     //getting as string with lines
.map(x=>[...x])                          //to 2d string array
  .map((R,y,r)=>                         //r - the new 2d string array
    R.map((c,x)=>{                       //
      for(D=2;c<"#"&&D--;)              //instead of using if joining c==" " with the loop,D=1/0
        {for(;                           //
         (T=(r[y+=D]||0)[x+=!D])>" ";);  //0[num] = undefined. checking for a path - consisting of # or .(or not consisting of space or undefined), we dont need temp (X,Y) because in the next loop we will return to our original position regardless of the correctness of the path
           for(;T&&r[y-=D][x-=!D]>c;)    //again instead of if(T) combine with loop. if T is not undefined it will be a space because the array can return .#(space). and we then go back to the source(x,y)
                                         //remeber that c==" "
             r[y][x]="."                 //and just putting . where weve been
     }})&&R.join``                       //instead of return r as string at the end , we know that we cant change a row at a smaller index(due to D-0/1) so we can return R.join`` already
    ).join`
`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.