Задний план
Вы - ученик могущественного волшебника, и ваш мастер в настоящее время разрабатывает заклинание для создания межмерного лабиринта, чтобы заманить в ловушку его врагов. Он хочет, чтобы вы запрограммировали его паровой компьютер для анализа возможных макетов. Программирование этой дьявольской машины очень опасно, поэтому вы захотите сделать код максимально коротким.
вход
Ваш ввод представляет собой двумерную сетку периодов .
и хэшей #
, обозначающую пустое пространство и стены, заданную в виде строки с разделителями новой строки. Всегда будет хотя бы один .
и один #
, и вы можете решить, есть ли завершающий символ новой строки или нет.
Эта сетка является планом бесконечного лабиринта, который создается путем выравнивания бесконечного числа копий сетки рядом друг с другом. Лабиринт разделен на полости , которые связаны компонентами пустых пространств (диагонально смежные пространства не связаны). Например, сетка
##.####
...##..
#..#..#
####..#
##...##
приводит к следующему лабиринту (продолжается бесконечно во всех направлениях):
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
Этот конкретный лабиринт содержит полость бесконечной области. С другой стороны, этот проект приводит к лабиринту только с конечными полостями:
##.####
##..###
####...
..####.
#..####
Выход
Ваш вывод должен быть истинным значением, если лабиринт содержит бесконечную полость, и ложным значением, если нет. Обратите внимание, что лабиринт может содержать как конечные, так и бесконечные полости; в этом случае вывод должен быть правдивым.
правила
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Дополнительные тестовые случаи
Бесконечные полости:
.#
#.#
...
#.#
#.###.#.###.#
#.#...#...#.#
#.#.#####.#.#
..#.#...#.#..
###.#.#.#.###
#...#.#.#...#
#.###.#.###.#
##.###
#..###
..##..
###..#
##..##
..#..#..#..#..#..#
.#..#..#..#..#..#.
#..#..#..#..#..#..
#.####.###.###.####
#...#..#...###..###
###.#..#.######..##
....####.#######...
###..###...########
##########.##....##
..###......##.##...
#.........##..#####
###########..###..#
#...........####..#
#.###########.##..#
#.##....##.....####
#.####.###.###.####
Конечные полости:
###
#.#
###
.#
#.
####
.#..
####
#.#.#
..#..
#####
..#..
#.#.#
#.#.#.#.#.#
..#...#.#..
###.###.###
..#.#......
#.#.#######
#.#.......#
#.#######.#
#.#.....#.#
#.#.#.#.#.#
##....#####
.#..#...##.
.##.#..#...
..###.###..
#..##.#####
#...##....#
#.#.#####.#
###..####.#
....####...
###...#####
###....##.#########
####...##....#...##
..####.#######.###.
....##..........##.
###..#####.#..##...
####..#..#....#..##
..###.####.#.#..##.
..###...#....#.#...
..####..##.###...##
#.####.##..#####.##
####...##.#####..##
###########
........#..
#########.#
..........#
.##########
.#.........
##.########
...#.......
.
и один#
на входе.Ответы:
JavaScript (ES6), 235
253Тот же метод, который используется @mac. Для каждой свободной ячейки я пробую рекурсивное заполнение, помечая использованные ячейки используемой мной координатой (это может быть вне оригинального шаблона). Если во время заполнения я прибуду в ячейку, уже отмеченную с другой координатой, я нахожусь в бесконечном пути.
Изворотливый способ обработки по модулю в JS это очень раздражает.
Тест в консоли Firefox / FireBug
бесконечность
Выход
конечный
Выход
источник
(j%4-1)%2
дает хороший повторяющийся узор.L=
байтов.C # -
423375 байтЗавершить программу на C #, принять ввод через STDIN, вывести «True» или «False» в STDOUT в зависимости от ситуации.
Я не мог оставить этого Линка там ... к счастью, его удаление окупилось! Теперь он отслеживает просмотренные и посещенные ячейки в массиве (учитывая, что он все равно просматривает только их конечное число). Я также переписал код направления, устраняя необходимость в лямбда-выражениях и вообще делая код более недоступным для понимания (но с существенной экономией байтов).
Это поиск в ширину (не это имеет значение), который продолжается до тех пор, пока он либо не застрянет в конечной пещере, либо решит, что пещера достаточно велика, чтобы быть бесконечно большой (если в ней столько клеток, сколько оригинальный прямоугольник, это означает, что должен быть путь от одной ячейки к себе куда-то еще, и мы можем продолжать следовать ей вечно).
Код без полей:
источник
C#
ответ как лучший получатель голосов здесь.Python 2 -
258210244 байтаРекурсивно проверять пути, если переполнение стека возвращает 1 (правда), в противном случае возвращает Нет (фальси).
источник
;
для строкp
, так как вы получите их на одной строке сif
.Python 2 -
297286275 байтВыбирает произвольную «открытую» ячейку, чтобы начать заполнение потока. Лабиринт бесконечен, если во время заполнения мы повторно посещаем ячейку, которую мы уже посетили, но у нее есть координата, отличная от предыдущего посещения. Если заливка заполняет весь регион, не найдя такой ячейки, попробуйте другой регион. Если такая область не может быть найдена, лабиринт конечен.
Принимает файл для обработки в командной строке, возвращает код
1
завершения для бесконечного и0
для конечного.Возвращает правильные результаты для всех тестов.
источник