Вы Рубин, инженер путей сообщения. Ваша задача - проложить путь в любой данной долине так, чтобы она посещала каждую станцию ( M
). Величина проложенного пути не важна, но она должна быть проложена по одной непрерывной траектории, которая начинается и заканчивается в точке входа / выхода из долины ( >
) и не пересекает себя в любой точке. Есть еще несколько ограничений: горы ( ^
) непроходимы, поэтому вы должны обходить их, реки ( ~
) должны пересекаться с помощью моста ( X
), а край долины ( #
) также непроходим.
Правила трассы
Если дорожка не проложена должным образом, будут сходить с рельсов, и никто не хочет этого, поэтому вот правила размещения дорожек.
Есть четыре вида трека: -
|
/
\
.
Вот как каждый может сочетаться с другими:
Разрешенные комбинации из -
(в центре каждого примера):
##### ##### ##### ##### ##### ##### #####
# # # # #\ # # # # /# #\ /# # #
#---# # --# # --# #-- # #-- # # - # # - #
# # #/ # # # # \# # # # # #/ \#
##### ##### ##### ##### ##### ##### #####
-
никогда не может быть объединено с |
. Это слишком крутой поворот, чтобы поезда могли безопасно проехать.
Разрешенные комбинации из /
(в центре каждого примера):
##### ##### ##### ##### ##### ##### #####
# /# # -# # |# # /# # /# # -# # |#
# / # # / # # / # # / # # / # # / # # / #
#/ # #/ # #/ # #| # #- # #| # #- #
##### ##### ##### ##### ##### ##### #####
\
никогда не может быть объединено с /
. Это слишком крутой поворот, чтобы поезда могли безопасно проехать.
Разрешенные комбинации из \
(в центре каждого примера):
##### ##### ##### ##### ##### ##### #####
#\ # #- # #| # #\ # #\ # #- # #| #
# \ # # \ # # \ # # \ # # \ # # \ # # \ #
# \# # \# # \# # |# # -# # |# # -#
##### ##### ##### ##### ##### ##### #####
Разрешенные комбинации из |
(в центре каждого примера):
##### ##### ##### ##### ##### ##### #####
# | # #\ # # /# # | # # | # # /# #\ #
# | # # | # # | # # | # # | # # | # # | #
# | # # | # # | # #/ # # \# # \# #/ #
##### ##### ##### ##### ##### ##### #####
Треки могут объединяться со станциями, мостами и входом / выходом из долины следующими способами:
##### ##### #####
#\|/# #\|/# #/ #
#-M-# #-X-# >- #
#/|\# #/|\# #\ #
##### ##### #####
На станциях есть поворотные столы, поэтому разрешено покидать станцию под острым углом (хотя не обратно, как вы пришли - вам не захочется врезаться в следующий запланированный поезд, идущий в другую сторону!).
Мосты предназначены для пересечения рек, поэтому вы должны выйти из моста на противоположной стороне реки, в которую вы вошли.
вход
Ввод будет через STDIN для программ или аргумент функции для функций. Если вашей функции нужно имя для того, чтобы я мог запустить его на моем входе, то это объявление имени должно быть включено в число байтов.
На входе будет одна строка с переносами строк. Каждая строка внутри вашего ввода всегда будет иметь ту же длину, что и другие, что дает вам прямоугольный ввод. Край ввода всегда будет сплошным и непроходимым ( #
), за исключением точки входа. Любой заданный вход будет иметь хотя бы один действительный ответ.
Выход
Ваш вывод должен быть возвращен в виде одной строки с переносами строк из функции или напечатан / выведен на экран для полных программ.
Вывод должен быть таким же, как ввод, но с добавленными символами дорожки.
счет
Победителем будет самый короткий код в байтах.
Контрольные примеры
###########
# M #
# ^ #
> ^^ M #
# ^ #
#~~~~~~~~~#
# M #
# ^^ #
# M#
###########
#################
# #
# M M #
# ^ #
# ^ M #
#~~~~~~~^ #
# #
# ^ #
# M^ #
# ^ #
> ^^^ M#
# #
# M #
#################
###############
# M ~ #
# ~ #
> ~ M #
# ~ #
# ~ #
# ~ #
###############
Возможные решения для тестовых случаев
###########
# ---M #
#/ ^ \ #
> ^^ M #
#\ ^ | #
#~X~~~~X~~#
# M \ #
# \ ^^ |#
# -----M#
###########
#################
# #
# M---------M #
# | ^ / #
# / ^ M- #
#~X~~~~~^ | #
# | \ #
# \^ \ #
# --M^ \ #
#/ ^ |#
> ^^^ M#
#\ / #
# -------M---- #
#################
###############
# M ~ #
#/ \ ~ #
> --X----M #
#\ ~ | #
# \ ~ / #
# ---X--- #
###############
Ответы:
Python 2 ,
3990343044124313 байтЭто в основном A * с уродливым эвристическим и уродливым
getChildren
методом. Для запуска 3-х тестовых случаев последовательно берет6.5s
на мою машину. Функцияf
является решением здесь. Он принимает карту в виде строки и возвращает решенную карту в виде строки.Попробуйте онлайн!
Тестовые случаи
Тест 1
Тест 2
Тест 3
Исходный код
A * State + A * Solver Class
Я фактически играл в гольф из своего решения. Но они существуют в моей «читаемой» версии. Класс State является общим и предназначен для реализации. Класс Solver принимает начальное состояние, а затем следует состояние эвристический
getDist
.Государственный класс
Это реализация класса состояний A *. Самый важный метод здесь
getDist
, это эвристика для определения, насколько близкоself
к цели. Это в основном минимальное расстояние, чтобы посетить все оставшиеся пункты назначения и вернуться к началу.Класс карты
Этот класс хранит и обрабатывает карту.
isConnected
Метод, вероятно , является наиболее важной частью. Он проверяет, подключены ли 2 фрагмента трека.Обновления
;
систочник
elif e!=""and e in"MX>"
могут быть объединены в одну строку с тройнойif else
. Кроме того, некоторые из вашихdef
могут бытьlambda
s. Какdef A(s):return str(s)
может бытьA=lambda s:str(s)
, или, если вы измените с__str__
на__repr__
, вы можете использоватьA=lambda s:`s`
, в этот момент, даже не стоит иметь вA
качестве своей собственной функции, так как для вызова требуются скобки. Просто используйте галочки вместо.