Змея должна заполнить любой лабиринт (пока он не застрянет).
Змея
Змея начинается в заданной начальной точке, указывая ВОСТОК . Он движется, всегда имея стену или часть своего тела сразу к ЛЕВОЙ своей головы (« последователь стены правила левой руки »), пока не застрянет, потому что все четыре направления вокруг его головы заняты. (Примечание: застрявшая змея не может заполнить все доступное пространство, но это не цель!)
Соревнование
Напишите программу или функцию, которая принимает лабиринт в качестве ввода в виде 2D-текста:
- Ввод может быть в любом разумном формате: например, список строк, одна строка с символами новой строки, файл.
- Лабиринт имеет стены ("
#
"), пустые места ("") и ровно одну отправную точку ("
o
"). Вы можете выбрать
- либо предположим, что первый и последний ряд и столбец являются полностью стенами;
- или предположим, что каждый вход имеет неявный внешний слой стен
Вы можете предположить, что начальная точка имеет стену (или неявную стену) прямо над ней (СЕВЕР) и что змея может сделать правильный стартовый ход в направлении ВОСТОК или ЮГ.
- Вы можете предположить, что в тексте нет других символов (кроме новых строк, если они нужны для ввода).
- Вы можете предположить, что все строки имеют одинаковую длину.
и печатает / возвращает «заполненный лабиринт» в качестве вывода со снимком змеи в тот момент, когда она застряла :
- Тело змеи представлено символами,
>v<^
указывающими, где находится ее следующий сегмент - Отправной точкой змеи является либо ее направление в начале ("
>
", если она не должна была повернуться немедленно), либоo
персонаж (нет необходимости быть последовательным) - Конечной точкой змеи является
o
персонаж
счет
Обычный код гольф: выигрывает самый короткий код
пример
in:
#################################
# o #
# #
# ## ### ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ### ## #
# ## ##### ## #
# ## ##### ## #
# ## ### ## #
# ## ## #
# #
# #
#################################
out:
#################################
#>>>>>>>>>>>>>>>>>>>v>>>>>>>>>>v#
#^>>>>>>>>>>>>>>>>>v>>>>>>>>>>vv#
#^^ ##>>>>>>v###o>>>>>v## vv#
#^^ ##>^ ##>>>>^## >v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##>^ ## ## >v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^ ##### v## vv#
#^^ ##^ ##### v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^<<<<<<<<<<<<<<<<## vv#
#^^<<<<<<<<<<<<<<<<<<<<<<<<<<<<v#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Анимированные (для иллюстрации):
Редактировать: обратите внимание, что в случае сомнений змея должна «держать левую руку» на стене, на которой она уже стоит, следуя углам, не прыгая на стену в 1 квартале.
Спасибо Джонатану Аллану за то, что поднял его, и Драко 18 за объяснительный снимок выше.
Другие примеры
in:
####################
# o# #
# ###
# #
# ## #
# ###
####################
out:
####################
#>>>>>>>>>>>>>>vv# #
#^>>>>>>>>>>>>vvv###
#^^ v<<<o<<<<v>>v#
#^^<<<<##^<<<<<<v<<#
#^<<<<<<<<<<<<<<<###
####################
in:
####################
# o #####
# #####
# #
# ##
####################
out:
####################
# >>>>v#####
# v#####
# >>>>o#
# ##
####################
in:
################
#o #
# ########## #
# # # #
# # # #
# # # #
# # # # #
# # # #
# # # #
# # # #
# ############ #
# #
################
out:
################
#>>>>>>>>>>>>>v#
#>>v##########v#
#^#>>>>>>>>>v#v#
#^#>>>>>>>>vv#v#
#^#^>>>>>>vvv#v#
#^#^^# vvv#v#
#^#^^o<<<<<vv#v#
#^#^^<<<<<<<v#v#
#^#^<<<<<<<<<#v#
#^############v#
#^<<<<<<<<<<<<<#
################