部屋に参加する


15

それで、ダンジョンの地図、たとえば、

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

ヒーローが部屋A(左上)にいて、彼らの目標(苦しんでいる王子様?)が部屋B(右下)にいるとしましょう。このマップでは、ヒーローが目標に到達することはできません。

通路を追加する必要があります...

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

そこに、はるかに良い!


ルール

  • ダンジョンマップ(ハッシュとスペースで構成され、行が改行文字で区切られている)を受け入れるプログラムまたは関数。
  • スペース文字間の直接パス上にあるすべてのスペース内の通路を示すためにドットが追加されたマップを出力します。
  • 行の長さや行数は変更されません。
  • 通路はすべて、スペースからスペースへの直線です。
    • 通路は角を曲がれない
    • スペースとマップの端の間にはありません。
  • 任意の言語を使用します。
  • 最小バイトで変換を実行してください。
  • 通路を描画できない場合は、マップをそのまま返します。
  • マップには常にすべてのエッジの周りにハッシュが必要です(エッジのスペースを処理する必要はありません)。
  • 入力マップは常に長方形で、各行は同じ幅でなければなりません。

テストケース

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

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

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

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

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

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

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

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

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

#およびとは異なる文字を使用できます.か?
user202729

1
@ user202729いいえ。それは最初からルールにありました、そして、それに関する1つの答えがすでにありました。おそらく、要求に一貫性を持たせることが最善です。
-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など)から始めて、そこから進んでください。
エリックアウトゴルファー

正直に言うと、私をはるかに超えるように思えますが、プロセスがどのように機能するかを見るのが大好きです。
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

Haskell209 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))を使用して、括弧の一部を減らすことができます。場合によって!!0head、代わりに使用することもできます。
ポストロックガーフハンター

実際、特定のケースで(k(take 2 c))は外側の括弧を削除するだけでよく、それらは必要ありません。しかし、drop(length(head d))あなたはまだを使用することができ$、それをdrop(length$head d)(さらにはdrop(length$d!!0))に置き換えます。
ポストロックガーフハンター

さらに、k代わりに使用する場合++、最後の行を大幅に減らすことができます。k[' '<$k(take 2 c),'.'<$d!!0,drop(length$d!!0)$f$k$d]
ポストロックガーフハンター

最後のゴルフでは、最後の行をに置き換えることができますf b|(e:g:d@(h:_:_))<-group b=k[' '<$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$b。これは、パターンマッチを使用して、以前行われていた多くの重いリフティングを行います。
ポストロックガーフハンター

1
ヘビーデューティゴルフ@ user56656をありがとう!Ungolfedには2つの関数としてfがあり、それらを全体として最適化せずに貼り付けました。それは心に留めておくべき良いことです。
アオエミカ


2

Retina 0.8.2、95バイト

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

オンラインでお試しください!説明:

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

これは探します #スペースまたは.sの上記号をそれらがなくなるまでドットに変えます。後読みは#の列を検出し、先読みは次の行にスキップし、下の同じ列にアトミックにスキップするため、スペースまたは.が正確に下にある場合にのみ一致し#ます。

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

これは、.スペースまたは.sの下にない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`
`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.