加入房间


15

所以,这里有一张地牢的地图...

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

假设英雄在房间A(在左上方)中,而他们的目标(王子在遇难中?)在房间B(在右下方)中。我们的地图不允许英雄前进到他们的目标。

我们需要增加一条通道...

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

在那里,好多了!


规则

  • 接受地牢图(由散列和空格组成,行由换行符分隔的程序或函数)。
  • 它将输出一个地图,该地图上添加了点,以表示在空格字符之间的直接路径上的所有空格中的段落。
  • 它不会更改行长或行数。
  • 通道都是从空间到空间的直线。
    • 通道不能转弯
    • 它们不会在空间和地图边缘之间。
  • 使用任何语言。
  • 尝试以最少的字节数执行转换。
  • 如果无法绘制通道,请返回地图,保持不变。
  • 贴图的所有边缘都应始终具有哈希值(您无需在边缘处处理空格)。
  • 输入地图始终为矩形,每行宽度应相同。

测试用例

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

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

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

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

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

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

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

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

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

我可以使用与#和不同的字符.吗?
user202729'4

1
@ user202729不。从一开始它就是规则,并且已经有了一个答案。最好使需求保持一致。
AJFaraday

@ user202729您建议的测试用例类似于我的倒数第二个用例。下一次更改问题时,我可能会添加它,但是并没有增加太多。
AJFaraday

...我只是没有向下滚动。没问题。
user202729'4

@ l4m2同样的规则适用,只要房间之间有一条直线,就是一条通道。因此,U形房间的空隙将被通道填充。
AJFaraday

Answers:


7

果冻,17个字节

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

在线尝试!

Tricky -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是“茶和饼干”的简称吗?还是我现在只是超级英国人?
AJFaraday

5
对于这个答案,一个解释会很酷。
塔玛斯·森格尔


3

APL + WIN,87个字节

提示输入字符矩阵:

n←(' '=m←⎕)⋄c←(∨⍀n)+⊖∨⍀⊖n⋄r←(∨\n)+⌽∨\⌽n⋄((,c>1)/,m)←'.'⋄((,r>1)/,m)←'.'⋄((,n)/,m)←' '⋄m

3

哈斯克尔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
发布Rock Garf Hunter,

实际上,在特定情况下,(k(take 2 c))您只需删除外括号即可,而不必使用。但是,在drop(length(head d))您仍然可以使用的情况下$,将其替换为drop(length$head d)(甚至drop(length$d!!0))。
发布Rock 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上打高尔夫球!放开我,我有f作为2个函数,只是将它们粘贴到一起,而没有对它们进行整体优化。请记住这是一件好事。
aoemica

2

Python 2中173个 148字节的

m=input().split('\n')
exec"m=zip(*[[c*(c!='#')or'#.'[(' 'in r[i:])*(' 'in r[:i])]for i,c in enumerate(r)]for r in m]);"*2
for r in m:print''.join(r)

在线尝试!


2

视网膜0.8.2,95字节

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

在线尝试!说明:

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

这将查找#空格或.s 上方的符号,并将它们变成点,直到没有剩余为止。向后查找会找到#的列,然后向前跳转到下一行,并自动跳到下面的同一列,以便空格或.仅在恰好在下方时才能匹配#

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

这将查找.不位于空格或.s 以下的s,然后将它们变回#s,直至没有剩余。先行查找.的列,然后后行以几乎相同的方式跳到上一行,并自动跳到上方的同一列,以便空格或.仅在正好在上方时才能匹配#。后面使用负数,因此它也适用.于第一行中的。

 (\S+) 
 $.1$*. 

(请注意两行的尾随空格)这只是在空格之间查找所有非空格字符行,并确保它们都是.s。




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`
`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.