객실 가입


15

여기에 던전의지도가 있습니다.

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

영웅이 A 방 (왼쪽 상단)에 있고 그들의 목표 (고난의 왕자?)가 B 방 (오른쪽 아래)에 있다고 가정 해 봅시다. 우리의지도는 영웅이 목표를 달성하도록 허용하지 않습니다.

통로를 추가해야합니다 ...

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

훨씬 더 좋습니다!


규칙

  • 던전 맵 (해시 및 공백으로 구성되며 행은 줄 바꾸기 문자로 구분됨)을 허용하는 프로그램 또는 함수입니다.
  • 공백 문자 사이의 직접 경로에있는 모든 공백의 통로를 나타 내기 위해 점이 추가 된 맵을 출력합니다.
  • 줄 길이나 줄 수는 변경되지 않습니다.
  • 통로는 모두 공간에서 공간으로 직접 연결되어 있습니다.
    • 통로는 코너를 돌 수 없습니다
    • 공간과지도 가장자리 사이에는 있지 않습니다.
  • 모든 언어를 사용하십시오.
  • 가장 적은 바이트로 변환을 시도하십시오.
  • 통로를 그릴 수없는 경우 변경없이 맵을 반환하십시오.
  • 지도에는 항상 모든 모서리 주위에 해시가 있어야합니다 (가장자리에서 공백을 처리 할 필요는 없습니다).
  • 입력 맵은 항상 직사각형이며 각 행의 너비는 동일해야합니다.

테스트 사례

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

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

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

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

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

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

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

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

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

#와 다른 문자를 사용할 수 있습니까 .?
user202729

1
@ user202729 아니요. 그것은 처음부터 규칙에 있었고 이미 그것에 대한 답변이 하나 있습니다. 요구 사항을 일관되게 유지하는 것이 가장 좋습니다.
AJFaraday

@ user202729 제안한 테스트 사례는 제 2 회 사례와 유사합니다. 다음에 질문을 변경할 때 추가 할 수는 있지만 많이 추가하지는 않습니다.
AJFaraday

... 난 그냥 아래로 스크롤하지 않았다. 문제 없어요.
user202729

@ l4m2 같은 규칙이 적용됩니다. 방 사이에 직선이있는 곳은 통로입니다. 따라서 U 자 모양의 방에는 통로가 채워져 있습니다.
AJFaraday

답변:


7

젤리 , 17 바이트

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

온라인으로 사용해보십시오!

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)로 시작하여 거기서부터 작업하십시오.
Outgolfer Erik

솔직히 말하면 그것은 먼 길처럼 보이지만 프로세스가 어떻게 작동하는지 보는 것을 좋아합니다.
AJFaraday

7
잠깐, TNB는 '차와 비스킷'의 줄임말입니까? 아니면 지금 방금 영국 최고입니까?
AJFaraday

5
이 답변에 대한 설명은 멋질 것입니다.
Tamás Sengel


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.
Post Rock Garf Hunter

실제로 특정 경우 (k(take 2 c))에는 외부 괄호를 제거 할 수 있으며 필요하지 않습니다. 그러나 drop(length(head d))여전히을 사용 $하여을 drop(length$head d)(및 심지어 drop(length$d!!0))로 바꿀 수 있습니다 .
Post Rock Garf Hunter

또한 k대신에 사용 ++하면 마지막 줄을 크게 줄일 수 있습니다. k[' '<$k(take 2 c),'.'<$d!!0,drop(length$d!!0)$f$k$d].
Post Rock Garf Hunter

마지막 골프 하나, 마지막 줄은로 교체 할 수 있습니다 f b|(e:g:d@(h:_:_))<-group b=k[' '<$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$b. 이것은 패턴 일치를 사용하여 이전에 수행 된 많은 양의 리프팅을 수행합니다.
Post Rock Garf Hunter

1
헤비 듀티 골프 @ user56656에 감사드립니다! Ungolfed 나는 f를 2 개의 함수로 가지고 있었고 전체적으로 최적화하지 않고 함께 붙여 넣었습니다. 명심해야합니다.
aoemica


2

레티 나 0.8.2 , 95 바이트

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

온라인으로 사용해보십시오! 설명:

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

이 모습 #공백이나 위에있는 징후 .아무도 남지 않을 때까지 점으로의 교대를. lookbehind는 #의 열을 찾은 다음 lookahead는 다음 행으로 건너 뛰고 아래의 동일한 열로 원자 적으로 건너 뛰므로 공백 .이 정확히 또는 아래에있는 경우에만 일치 할 수 있습니다 #.

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

이 모습 .공백이나 아래에하지의 .뒷면에 s와 회전 그들을 #아무도 남지 않을 때까지의. lookahead는 .의 열을 찾은 다음 lookbehind는 이전 행으로 건너 뛰고 위와 동일한 열로 거의 같은 방식으로 건너 뛰어 공백 .이 정확히 위의 경우에만 일치합니다 #. 음수 lookbehind가 사용되어 .맨 위 행 에서도 작동합니다 .

 (\S+) 
 $.1$*. 

(두 줄의 후행 공백에 유의하십시오.) 이것은 공백 사이의 공백이 아닌 문자의 모든 실행을 찾아서 모두 공백이되도록합니다 ..




1

자바 스크립트 (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.