Итак, вот карта, скажем, темницы ...
##########
# #####
# #####
##########
##########
##########
##########
#### ##
#### ##
##########
Скажем, герой находится в комнате A (вверху слева), а его цель (принц в беде?) - в комнате B (справа внизу). Наша карта не позволяет герою продвигаться к своей цели.
Нам нужно добавить проход ...
##########
# #####
# #####
####.#####
####.#####
####.#####
####.#####
#### ##
#### ##
##########
Там намного лучше!
правила
- Программа или функция, которая принимает карту подземелий (состоящую из хэшей и пробелов, со строками, разделенными символами новой строки).
- Он выведет карту с добавленными точками для обозначения проходов во всех пробелах, которые находятся на прямом пути между пробелами.
- Это не изменит длину строки или количество строк.
- Проходы все по прямой линии от пробелов к пробелам.
- Проходы не могут поворачивать за углы
- Они не будут находиться между пробелами и краем карты.
- Используйте любой язык.
- Попытайтесь выполнить преобразование в наименьшем количестве байтов.
- Если никакие проходы не могут быть нарисованы, верните карту без изменений.
- На карте всегда должны быть хэши по всем краям (вам не нужно обрабатывать пробелы по краям).
- Входные карты всегда прямоугольные, каждая строка должна быть одинаковой ширины.
Контрольные примеры
#### ####
# # => # #
# # # #
#### ####
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
########## ####.#####
########## ####.#####
#### ## #### ##
#### ## #### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##########
########## => ##########
########## ##########
########## ##########
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
#### ### #### ###
########## ######.###
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##..######
########## => ##..######
########## ##..######
########## ##..######
## ####### ## .######
## ###### ## ######
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
########## => #.########
########## #.########
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
##### ### => #.### ###
##### ### #.### ###
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
## # ## #
########## ##......##
########## ##......##
########## => ##......##
########## ##......##
########## ##......##
########## ##......##
# ## # ##
########## ##########
########## ##########
#### #### #### ####
####### ## ####..# ##
###### ### ####.. ###
# ### ## # => # ... .. #
# ## ### # # .. ... #
### ###### ### ..####
## ####### ## #..####
#### #### #### ####
########## ##########
#
и.
?Ответы:
Желе , 17 байт
Попробуйте онлайн!
Хитрый -1 благодаря пользователю 202729 .
Объяснение:
источник
Perl 5
-p0
, 56 байтПопробуйте онлайн!
источник
APL + WIN, 87 байт
Подсказки для матрицы символов:
источник
Haskell ,
209165162 байта.Попробуйте онлайн!
Я уверен, что это не самый эффективный способ сделать это на Хаскеле.
На мой взгляд, в нем слишком много скобок, но я не знаю, как их удалить.источник
$
((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
, это использует комбинацию шаблонов, чтобы выполнить большую часть тяжелой работы, которая была сделана прежде.Python 2 ,
173148 байтПопробуйте онлайн!
источник
Сетчатка 0.8.2 , 95 байт
Попробуйте онлайн! Объяснение:
Он ищет
#
знаки над пробелами или.
s и превращает их в точки, пока не останется ни одного. Смотритель находит#
столбец ` s, а затем Смотритель переходит к следующей строке и атомарно к тому же столбцу ниже, так что пробел или.
может совпадать, только если он точно ниже#
.Это ищет
.
s, которые не находятся ниже пробелов или.
s и превращает их обратно в#
s, пока не останется ни одного..
Прозрачный элемент находит столбец 's', а затем lookbehind переходит к предыдущей строке и атомарно к тому же столбцу выше почти таким же образом, так что пробел или.
может совпадать, только если он находится точно над#
. Используется отрицательный вид сзади, так что это также работает для.
s в верхнем ряду.(Обратите внимание на конечный пробел в обеих строках) Это просто ищет все серии непробельных символов между пробелами и гарантирует, что все они
.
s.источник
Рубин , 104 байта
Попробуйте онлайн!
Ну, это не здорово, но, по крайней мере, оно запутанное. Я уверен, что это может быть улучшено.
источник
Stax , 19 байт
Запустите и отладьте его
источник
JavaScript (Node.js) ,
205193190186181175172 байтаПопробуйте онлайн!
комментарии
источник