Змея должна заполнить любой лабиринт (пока он не застрянет).
Змея
Змея начинается в заданной начальной точке, указывая ВОСТОК . Он движется, всегда имея стену или часть своего тела сразу к ЛЕВОЙ своей головы (« последователь стены правила левой руки »), пока не застрянет, потому что все четыре направления вокруг его головы заняты. (Примечание: застрявшая змея не может заполнить все доступное пространство, но это не цель!)
Соревнование
Напишите программу или функцию, которая принимает лабиринт в качестве ввода в виде 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#
#^<<<<<<<<<<<<<#
################
Ответы:
Древесный уголь ,
9468 байтПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Хлопать ввод в строку. Этого можно избежать, используя менее удобный формат ввода.
Распечатайте ввод, не перемещая курсор, а затем распечатайте его
o
снова, чтобы курсор оказался под ним.Инициализируйте текущее направление.
Повторите, пока есть свободное место в каком-то направлении.
Подсчитайте, может ли змея повернуть налево или она вынуждена повернуть направо. Код
≦⊖θW¬⁼§KVθ ≦⊕θ
также работает для этого с тем же количеством байтов, хотя он считает,0
что вверх, а не правильно, поэтому остальная часть кода должна быть адаптирована.Выведите соответствующий символ тела в соответствующем направлении.
Восстановить голову. Это также может быть записано как
Po
печать головы без перемещения курсора вместо каждого прохода по циклу (но это позволяет неявно закрывать цикл для одного и того же числа байтов).источник
Python 2 ,
273253242 байта-11 байт благодаря ArBo
Попробуйте онлайн!
Это работает путем поиска строки
'o '
и замены ее'[>v<^]o'
, если она находится в лабиринте.Та же самая проверка будет также сделана на повернутом лабиринте, печатая заполненный лабиринт, когда строки больше нет.
Функция
t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))
используется для поворота сеткиисточник
Желе ,
7256 байтПопробуйте онлайн!
Полная программа, которая принимает входные данные в виде списка строк и возвращает список строк с последней змеей. Обратите внимание, что нижний колонтитул в TIO преобразует одну строку, разделенную символом новой строки, в нужный ввод и восстанавливает символы новой строки в конце; это просто для удобства.
Решение в некоторой степени вдохновлено методом, используемым в ответе @ Rod's Python 2 , хотя реализация сильно отличается.
источник
Рубин ,
126118 байт-8 байтов, сохраненных путем злоупотребления,
+=
вместо ручного поискаo
снова после изменения положения.Попробуйте онлайн!
источник
Запрос T-SQL 2008,
373371366 байтУ меня был список приоритетов, всегда скользящий влево, прямо, направо. Я изменил этот приоритет, чтобы всегда скользить назад, влево, прямо, вправо. Скольжение назад всегда будет заблокировано, поэтому приоритет остается тем же, кроме первого. Изначально поворачивая змею вниз (C = 4), она пытается скользить вверх при обратном скольжении. Этот маленький трюк спас мне 2 байта. Потому что мне не нужно было добавлять 1 к ~ - ~ -c% 4.
Я вставил 2 переноса строки, чтобы сделать его читаемым
Мне пришлось внести некоторые незначительные изменения, чтобы выполнить это онлайн, опубликованная версия работает в студии управления сервером MS-SQL.
Нажмите Ctrl-T перед выполнением в MS-SQL server management studio, это покажет результат в виде текста.
Попробуйте онлайн
источник
Python 3 , 343 байта
Попробуйте онлайн!
-11 байт благодаря ArBo
-4 байт благодаря Джонатану Фреху
источник
X
,Y
иF
чтобы ,X=0,1,0,-1;F,*Y=*X,0
если я не ошибаюсь. Кроме того,import*
стоит вам больше байтов, чем экономит.*g,=map(...)
. Иsys.stdin.readlines()
работает ли возможно?input()
.if C=="o"
~>if"o"==C
,if g[r+X[L]][c+Y[L]]==" "
,elif g[r+X[F]][c+Y[F]]>" "
,if g[r-X[L]][c-Y[L]]>" "
Соответственно.05AB1E ,
5452 байтаВвод / вывод как одна многострочная строка.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Pyth , 161 байт
Попробуйте онлайн!
Порт решения HyperNeutrino для Python 3 . Теперь, когда я закончил с этим, я подумал, что, возможно, мне следовало бы вместо этого перенести решение Rod's Python 2, но я уже потратил слишком много времени на это.
источник