Bergabunglah dengan kamar

15

Jadi, inilah peta, katakanlah, penjara bawah tanah ...

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

Katakanlah pahlawan di Kamar A (di kiri atas) dan tujuan mereka (seorang pangeran dalam kesusahan?) Ada di Kamar B (di kanan bawah). Peta kami tidak memungkinkan pahlawan untuk maju ke tujuan mereka.

Kita perlu menambahkan lorong ...

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

Di sana, jauh lebih baik!


Aturan

  • Program atau fungsi yang menerima peta ruang bawah tanah (terdiri dari hash dan spasi, dengan baris yang dipisahkan oleh karakter baris baru).
  • Ini akan menampilkan peta dengan titik-titik yang ditambahkan untuk menunjukkan bagian-bagian di semua ruang yang berada di jalur langsung antara karakter ruang.
  • Itu tidak akan mengubah panjang garis, atau jumlah garis.
  • Semua lorong ada dalam garis langsung dari spasi ke spasi.
    • Lorong tidak bisa berbalik sudut
    • Mereka tidak akan berada di antara spasi dan tepi peta.
  • Gunakan bahasa apa pun.
  • Coba lakukan konversi dalam byte paling sedikit.
  • Jika tidak ada lorong yang bisa ditarik, kembalikan peta, tidak berubah.
  • Peta harus selalu memiliki hash di sekitar semua tepi (Anda tidak perlu menangani spasi di tepi).
  • Peta input selalu berbentuk persegi panjang, setiap baris harus memiliki lebar yang sama.

Uji kasus

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

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

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

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

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

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

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

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

##########        ##########
####  ####        ####  ####
####### ##        ####..# ##
###### ###        ####.. ###
# ### ## #    =>  # ... .. #
# ## ### #        # .. ... # 
### ######        ### ..####
## #######        ## #..####
####  ####        ####  ####
##########        ##########
AJFaraday
sumber
Bisakah saya menggunakan karakter yang berbeda dari #dan .?
user202729
1
@ user202729 Tidak. Itu sudah ada dalam aturan sejak awal, dan sudah ada satu jawaban. Mungkin yang terbaik untuk membiarkan req konsisten.
AJFaraday
@ user202729 Kasing uji yang Anda sarankan mirip dengan kasing belakang saya. Saya mungkin menambahkannya ketika saya selanjutnya mengubah pertanyaan, tetapi tidak menambah banyak.
AJFaraday
... Aku hanya tidak menggulir ke bawah. Tidak masalah.
user202729
@ l4m2 Aturan yang sama berlaku, di mana pun ada garis lurus antara kamar, itu adalah lorong. Jadi ruangan berbentuk u akan memiliki celah diisi dengan lorong-lorong.
AJFaraday

Jawaban:

7

Jelly , 17 byte

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

Cobalah online!

Tricky -1 terima kasih kepada pengguna202729 .

Penjelasan:

ỴḲ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
Erik the Outgolfer
sumber
2
Itu selalu membuat saya kagum betapa cepatnya orang dapat menghadapi tantangan ini, dan dalam beberapa karakter.
AJFaraday
@AJFaraday Baiklah, maka Anda bisa menjadi bagian darinya juga. :) Mulai saja dengan bahasa golf berbasis stack (mis. CJam, 05AB1E) dan mulai dari sana.
Erik the Outgolfer
Jujur saja, jauh dari saya, jujur, tapi saya suka melihat bagaimana prosesnya bekerja.
AJFaraday
7
Tunggu, apakah TNB kependekan dari 'teh dan biskuit'? Atau apakah saya hanya menjadi super Inggris sekarang?
AJFaraday
5
Penjelasan akan keren untuk jawaban ini.
Tamás Sengel
5

Perl 5 -p0 , 56 byte

#!/usr/bin/perl -p0
/
/;$n="(.{@+})*";s%#%/ #*\G#+ |(?= )$n\G$n /s?".":$&%eg

Cobalah online!

Ton Hospel
sumber
3

APL + WIN, 87 byte

Anjuran untuk matriks karakter:

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

Haskell , 209 165 162 byte.

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

Cobalah online!

Saya yakin bukan cara yang paling efisien untuk melakukannya di Haskell. Terlalu banyak tanda kurung untuk keinginan saya, tetapi saya tidak yakin cara menghapus lagi.

aoemica
sumber
2
Selamat datang di situs ini! Anda dapat mengurangi beberapa tanda kurung dengan menggunakan $( (k(take 2 c))menjadi (k$take 2 c)). Anda juga dapat menggunakannya !!0sebagai ganti headdalam beberapa kasus.
Posting Rock Garf Hunter
Sebenarnya dalam kasus khusus (k(take 2 c))Anda hanya dapat menghapus tanda kurung luar, mereka tidak diperlukan. Tetapi dalam kasus drop(length(head d))Anda masih dapat menggunakan $, menggantinya dengan drop(length$head d)(dan bahkan drop(length$d!!0)).
Posting Rock Garf Hunter
Selain itu jika Anda menggunakan kbukannya ++Anda dapat sangat mengurangi baris terakhir. k[' '<$k(take 2 c),'.'<$d!!0,drop(length$d!!0)$f$k$d].
Posting Rock Garf Hunter
Satu golf terakhir, baris terakhir dapat diganti f b|(e:g:d@(h:_:_))<-group b=k[' '<$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$b, ini menggunakan pola yang cocok untuk melakukan banyak pengangkatan berat yang sedang dilakukan sebelumnya.
Posting Rock Garf Hunter
1
Terima kasih untuk tugas berat golf @ user56656! Ungolfed Saya memiliki f sebagai 2 fungsi dan hanya menempelkannya bersama tanpa mengoptimalkannya secara keseluruhan. Itu hal yang baik untuk diingat.
aoemica
2

Python 2 , 173 148 byte

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)

Cobalah online!

ovs
sumber
2

Retina 0.8.2 , 95 byte

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

Cobalah online! Penjelasan:

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

Ini mencari #tanda yang berada di atas spasi atau .s dan mengubahnya menjadi titik sampai tidak ada yang tersisa. Lookbehind menemukan kolom #'s dan kemudian lookahead melompat ke baris berikutnya dan secara atomis ke kolom yang sama di bawah sehingga ruang atau .hanya bisa cocok jika itu persis di bawah #.

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

Ini mencari .s yang tidak di bawah spasi atau .s dan mengubahnya kembali menjadi #s sampai tidak ada yang tersisa. Lookahead menemukan kolom .'s dan kemudian tampilan di bawah melompat ke baris sebelumnya dan secara atomis ke kolom yang sama di atas dalam banyak cara yang sama sehingga ruang atau .hanya bisa cocok jika tepat di atas #. Tampilan negatif di belakang digunakan sehingga ini juga berfungsi untuk .s di baris atas.

 (\S+) 
 $.1$*. 

(Catatan trailing space pada kedua baris) Ini hanya mencari semua run karakter non-spasi putih antara spasi dan memastikan bahwa semuanya adalah .s.

Neil
sumber
1

Ruby , 104 byte

->s{2.times{s=((0...s=~/\n/).map{|i|s.lines.map{|b|b[i]}*""}*"\n").gsub(/ [#.]+(?= )/){$&.tr(?#,?.)}};s}

Cobalah online!

Memang tidak bagus, tapi setidaknya berbelit-belit. Saya yakin itu bisa diperbaiki.

Pasang kembali Monica - notmaynard
sumber
1

Stax , 19 byte

╛XA╟φkôα`æbπ┐w↨╙j≥☺

Jalankan dan debug itu

rekursif
sumber
Saya khawatir tautan debug Anda menunjukkan kode kosong.
AJFaraday
@AJFaraday: Browser mana yang Anda gunakan? Ini berfungsi untuk saya di Chrome untuk Windows.
rekursif
1

JavaScript (Node.js) , 205 193 190 186 181 175 172 byte

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`
`

Cobalah online!

Berkomentar

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`
`
DanielIndie
sumber