Приєднуйтесь до кімнат


15

Отже, ось карта, скажімо, підземелля ...

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

Скажімо, що герой перебуває в кімнаті A (вгорі зліва), а їх мета (принц у біді?) Знаходиться в кімнаті B (праворуч знизу). Наша карта не дозволяє герою просуватися до своєї мети.

Нам потрібно додати прохід ...

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

Там, набагато краще!


Правила

  • Програма або функція, яка приймає карту підземелля (складається з хешів і пробілів, з рядками, розділеними новими символами рядків).
  • Він виведе карту з доданими крапками для позначення проходів у всіх просторах, які знаходяться на прямій відстані між символами пробілу.
  • Це не змінить довжину рядка чи кількість рядків.
  • Усі пасажі знаходяться в прямій лінії від пробілів до пробілів.
    • Проходи не можуть обертати кути
    • Їх не буде між пробілами та краєм карти.
  • Використовуйте будь-яку мову.
  • Спроба здійснити перетворення у найменших байтах.
  • Якщо проїздів не можна намалювати, поверніть карту без змін.
  • Карта завжди повинна мати хеші по всіх краях (Не потрібно обробляти пробіли на краю).
  • Карти вводу завжди прямокутні, кожен ряд повинен бути однакової ширини.

Тестові справи

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

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

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

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

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

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

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

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

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

Чи можу я використовувати різні символи, ніж #та .?
користувач202729

1
@ user202729 Ні. Це було в правилах з самого початку, і вже є одна відповідь на нього. Можливо, найкраще залишити відповідні запитання послідовними.
AJFaraday

@ user202729 Тестовий випадок, який ви запропонували, схожий на мій передостанній випадок. Я можу додати його, коли я наступну зміну питання, але він не додає багато.
AJFaraday

... Я просто не прокрутився вниз. Без проблем.
користувач202729

@ l4m2 Ці ж правила діють, де б між прямими не було прямої лінії, це прохід. Отже, у формі подібної кімнати щілина заповнюватиметься проходами.
AJFaraday

Відповіді:


7

Желе , 17 байт

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

Спробуйте в Інтернеті!

Хитрий -1 завдяки користувачу202729 .

Пояснення:

ỴḲ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
Зачекайте, чи короткий ТНБ для «чаю та печива»? Або я просто супербританець зараз?
AJFaraday

5
Пояснення було б крутим для цієї відповіді.
Тамас Сенгель


3

APL + WIN, 87 байт

Підказки до матриці символів:

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

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деяких випадків.
Пост Рок-Гарф Хантер

Насправді в конкретному випадку (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].
Опублікувати 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>.)*)[ .])
.

Це шукає #знаки, що знаходяться над пробілами або .s, і перетворює їх у крапки, поки не залишиться жодного. Позади пошуку знаходить #стовпчик 's, а потім lookahead переходить до наступного рядка та атомічно до того ж стовпця внизу, щоби пробіл або .збігався лише у тому випадку, якщо він знаходиться точно нижче #.

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

Це шукає .s, які не знаходяться нижче пробілів або .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`
`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.