Соедините комнаты

15

Итак, вот карта, скажем, темницы ...

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

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

Нам нужно добавить проход ...

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

Там намного лучше!


правила

  • Программа или функция, которая принимает карту подземелий (состоящую из хэшей и пробелов, со строками, разделенными символами новой строки).
  • Он выведет карту с добавленными точками для обозначения проходов во всех пробелах, которые находятся на прямом пути между пробелами.
  • Это не изменит длину строки или количество строк.
  • Проходы все по прямой линии от пробелов к пробелам.
    • Проходы не могут поворачивать за углы
    • Они не будут находиться между пробелами и краем карты.
  • Используйте любой язык.
  • Попытайтесь выполнить преобразование в наименьшем количестве байтов.
  • Если никакие проходы не могут быть нарисованы, верните карту без изменений.
  • На карте всегда должны быть хэши по всем краям (вам не нужно обрабатывать пробелы по краям).
  • Входные карты всегда прямоугольные, каждая строка должна быть одинаковой ширины.

Контрольные примеры

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

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

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

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

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

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

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

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

##########        ##########
####  ####        ####  ####
####### ##        ####..# ##
###### ###        ####.. ###
# ### ## #    =>  # ... .. #
# ## ### #        # .. ... # 
### ######        ### ..####
## #######        ## #..####
####  ####        ####  ####
##########        ##########
AJFaraday
источник
Могу ли я использовать символы, отличные от #и .?
user202729
1
@ user202729 Нет. Это было в правилах с самого начала, и уже был один ответ с ним. Вероятно, лучше всего оставить требования последовательными.
AJFaraday
@ user202729 Тестовый пример, который вы предложили, похож на мой предпоследний случай. Я мог бы добавить это, когда я в следующий раз изменю вопрос, но это не добавляет много.
AJFaraday
... Я просто не прокручивал вниз. Нет проблем.
user202729
@ l4m2 Те же правила применяются везде, где есть прямая линия между комнатами, это проход. Таким образом, в U-образной комнате будет проход, заполненный проходами.
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
Эрик Outgolfer
источник
2
Меня всегда удивляет, как быстро люди могут справиться с этими проблемами, и так мало персонажей.
AJFaraday
@ AJFaraday Ну, тогда ты тоже можешь быть частью этого. :) Просто начните с основанных на стеке языков игры в гольф (например, CJam, 05AB1E) и продолжайте свой путь оттуда.
Эрик 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

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

Попробуйте онлайн!

Я уверен, что это не самый эффективный способ сделать это на Хаскеле. На мой взгляд, в нем слишком много скобок, но я не знаю, как их удалить.

aoemica
источник
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)).
Пост Рок Гарф Хантер
Кроме того, если вы используете 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! Разгромленный Я имел f как две функции и просто вставил их вместе, не оптимизируя их в целом. Это хорошая вещь, чтобы иметь в виду.
Aoemica
2

Сетчатка 0.8.2 , 95 байт

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

Попробуйте онлайн! Объяснение:

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

Он ищет #знаки над пробелами или .s и превращает их в точки, пока не останется ни одного. Смотритель находит #столбец ` s, а затем Смотритель переходит к следующей строке и атомарно к тому же столбцу ниже, так что пробел или .может совпадать, только если он точно ниже #.

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

Это ищет .s, которые не находятся ниже пробелов или .s и превращает их обратно в #s, пока не останется ни одного. .Прозрачный элемент находит столбец 's', а затем lookbehind переходит к предыдущей строке и атомарно к тому же столбцу выше почти таким же образом, так что пробел или .может совпадать, только если он находится точно над #. Используется отрицательный вид сзади, так что это также работает для .s в верхнем ряду.

 (\S+) 
 $.1$*. 

(Обратите внимание на конечный пробел в обеих строках) Это просто ищет все серии непробельных символов между пробелами и гарантирует, что все они .s.

Нил
источник
1

Рубин , 104 байта

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

Попробуйте онлайн!

Ну, это не здорово, но, по крайней мере, оно запутанное. Я уверен, что это может быть улучшено.

Восстановить Монику - нотайнард
источник
1

Stax , 19 байт

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

Запустите и отладьте его

рекурсивный
источник
Боюсь, ваша ссылка для отладки показывает пустой код.
AJFaraday
@AJFaraday: Какой браузер вы используете? Это работает для меня на Chrome для Windows.
рекурсивный
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`
`
DanielIndie
источник