Вы были наняты в качестве научного сотрудника и попросили создать небольшую программу, которая будет создавать лабиринты для крыс. Крысиный ящик всегда 62х22 и имеет вход (а) и выход (А) для крысы, вот так (вход 1):
#######a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
#################################################A############
Ваша программа должна заполнить поле блоками (#), оставляя путь для крысы, вот так (вывод 1):
#######a######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ######################################################
####### ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
################################################# ############
#################################################A############
Это легко, вы думаете! Вы начинаете писать небольшую программу, полную уверенности. Однако у Принципиального ученого появилась новая идея - он хочет, чтобы две крысы одновременно перемещались по лабиринту. Доктор Раттаншнортер объясняет, что у них разные двери и разные выходы (вход 2):
#b#####a######################################################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# B
# #
#################################################A############
Крыс обучали двигаться прямо через перекрестки, но Т-образные перекрестки оставляют их безнадежно запутанными и лишают законной силы эксперимент. Вы начинаете свою новую более сложную задачу, когда хороший Доктор объясняет одно последнее требование: крысы дикие друг с другом, поэтому, если они увидят друг друга в какой-то момент, начнется драка крыс, и вы оба окажетесь перед доской этики. Теперь вы понимаете, что ваша программа должна выводить лабиринт примерно так (вывод 2):
#b#####a######################################################
# ##### ######################################################
# ##### ######################################################
# ##### ####################################### ####
# ##### ####################################### ######### ####
# ##### ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# ############################################# # ####### ####
# # ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### ####
################################################# ####### B
################################################# ############
#################################################A############
К тому времени, когда крыса B достигнет перекрестка, крыса A будет двигаться по коридору, чтобы выйти из A, и бой с крысой будет предотвращен.
Правила:
Ваша программа должна прочитать (STDIN или файл) входные данные, подобные приведенным выше, и вывести (STDOUT или файл) те же данные, за исключением того, что многие пробелы теперь будут хешами (#). Вы можете заменить любой отдельный символ (например,
;
) вместо\n
входной строки, но для выходной строки все еще требуются\n
символы. ОБНОВЛЕНОПуть крысы должен быть шириной в один символ, за исключением перекрестных пересечений (каждый пробел должен иметь ноль или два соседних с ортогональными
#
символами символа). У каждой крысы должен быть четкий отдельный путь, за исключением перекрестных пересечений. Т-образные перекрестки не допускаются.Крысы выпускаются одновременно и движутся с постоянной скоростью. Никогда две и более крысы не должны видеть друг друга (находиться в одном столбце или строке без одного или нескольких
#
символов между ними).Если решение невозможно (например, смежные точки входа), распечатайте
Impossible\n
и выйдите.Входы и выходы могут быть с любой стороны, однако они никогда не будут на углах.
Если совпадающие вход и выход находятся рядом (например:)
##aA##
, крыса не может перейти непосредственно отa
кA
. Внутри лабиринта должен быть небольшой 2-х пространственный коридор.На ходу, когда крыса достигает своей точки выхода (или в любое время после этого), она больше не видна другим крысам.
Ваша программа может быть рассчитана на вычисление лабиринтов для 1, 2, до 26 крыс.
Стандартные лазейки запрещены.
Гол:
Используя ваше решение, укажите, сколько крыс на лабиринт (N) может решить ваша программа. Ваша оценка - это длина вашего кода в байтах, деленная на это число N.
Пожалуйста, включите пример вывода в ваш ответ, чтобы мы могли увидеть, что производит ваша программа.
Ответы:
Haskell, 26 крыс ?, ~ 5000 байт
Теоретически, этот код должен работать для любого количества крыс, но я не даю никаких гарантий, что он прекратит работу до тепловой смерти вселенной. Он основан на алгоритме обратного отслеживания, который сначала пытается пройти по прямому пути, а затем переключать путь, если путь не работает. Количество альтернатив экспоненциально по отношению к длине пути и количеству крыс.
Я еще не удосужился поиграть в гольф, потому что он такой большой, и с тех пор я хочу сделать его быстрее.
Пример вывода, 6 крыс:
источник
b
добирается до пересеченияe
иb
не виденe
ли он ?b
Кажется, дошло до тогоt = 11
, что поставили быe
еще в тот коридор. Я что-то пропустил?Хаскелл, 1 крыса, 681 персонаж
Проблема может быть решена тривиально для всех лабиринтов с помощью одной крысы. Этот код также «работает» для любого количества крыс, но не соблюдает никаких ограничений на взаимодействие между несколькими крысами и путями.
Пример вывода:
Я планирую поддерживать много крыс, поэтому я написал общий код, но пока не нашел хорошего алгоритма для этого.
parse
извлекает список всех входов и выходов, с их координатамиrats
берет этот список и преобразует его в пары координат для каждой крысы.bnds
берет координату на ребре и перемещает ее к ближайшей координате внутри лабиринта.naive
занимает начальную и конечную позиции и возвращает простой путь между ними.main
затем заменяет все пробелы, не находящиеся на пути, на «#»источник