Некоторые текстовые мошеннические лайки не позволяют вам войти в стену и дают вам возможность вернуться, если вы попытаетесь это сделать. Зачем это делать, когда вы можете заставить игрока двигаться в ближайшем правильном направлении?
Соревнование
Напишите программу функций, которая, учитывая направление и сетку символов 3 на 3, выводит ту же сетку после того, как игрок сделал шаг.
Например,
9
#..
.@#
#.#
становится
#.@
..#
#.#
вход
Направление задается одной цифрой от 1 до 9, каждое из которых соответствует 8 основным направлениям и стоит на месте. Это получено из относительных местоположений чисел на клавиатуре:
NW N NE .. \ | / ... 7 8 9 W- 4 5 6 -E ... 1 2 3 ../ | \ SW S SE
Однако вы также можете использовать цифры 123, 456, 789 вместо 789, 456, 123. Другими словами, вы можете поменять местами верхние и нижние 2 строки или цифры, если вы того пожелаете. Это только две приемлемые комбинации индексов.Сетка 3 на 3 будет состоять из 3 различных печатных символов ASCII, представляющих проходной пол, стены и игрока. (В тестовых примерах
.
используется для пола,#
s - стены, и@
является игроком)- Вы можете выбрать, какие символы использует ваша программа, но вы должны указать их в своем ответе, и они должны быть согласованы в нескольких испытаниях.
- Символ, представляющий персонажа, всегда будет в середине сетки 3 на 3, а направление всегда будет между 1 и 9 (вкл.)
- Вы можете принять участие в любом порядке
- Сетка 3 на 3 может быть введена как массив символов, массив строк, строка длиной 9 или другая разумная альтернатива.
Выход
- Возврат из функции или вывод в StdOut или ближайшую альтернативу
- Пробелы и переводы строки разрешены
- Вы должны использовать те же представления символов, что и для ввода
- Те же форматы, разрешенные для входов, разрешены для выходов
Как игрок движется
Если указанное направление заблокировано стеной (например, если в приведенном выше примере было направление 6), то посмотрите на 2 ближайших направления:
- Если одно (и только одно) направление свободно, переместите игрока в этом направлении.
- Если нет свободных направлений, посмотрите на ближайшие 2 направления (исключая направление 5). Если вы завернули все вокруг и не нашли открытого направления (игрок окружен стенами), не двигайте игрока
- Если оба направления открыты, выберите одно, чтобы перейти к нему случайным образом (хотя и не обязательно равномерно).
Если данное направление 5, не двигайте игрока
Контрольные примеры
( #
= стена, .
= пол, @
= игрок)
Входные данные: 9 # .. . @ # #. # Выход: #. @ .. # #. # Входные данные: 3 # .. . @ # #. # Выход: # .. .. # # @ # Входные данные: 7 ##. # @ # .. # Выход: ## @ ##. #.# или #.# .. # @. # Входные данные: 5 ... . @. ... Выход: ... . @. ... Входные данные: 2 ### # @ # ### Выход: ### # @ # ###
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
yuhjklbn
? ПОКОЙСЯ С МИРОМ.123;456;789
вместо789;456;123
?Ответы:
Pyth -
7370 байтПопытайся
Ввод состоит из двух строк:
1-я строка: направление движения
2-я строка: доска (позиции 123456789, 123 - верхний ряд)
источник
JavaScript (ES6),
192163 байтаПримечания
Эта функция использует специальный формат ввода. Первый вход представляет собой массив целых чисел (
0
дляfloor
,1
дляwall
и2
дляplayer
), представляющих карту. Вторым входом является (перевернутое) направление:1
это северо-запад,2
север,3
северо-восток,4
запад и т. Д. Входные данные должны быть представлены через синтаксис карри (Z(a)(b)
).Контрольные примеры
Карты и направления были изменены в соответствии с моим форматом ввода.
источник
Python 3,
120104153176175 байтовПопробуйте онлайн!
Этот метод получает направление и список '.', '#' И '@'. Индексы начинаются с 1 до 9 (с 0 до 8 в списке). Так оно имеет вид
Метод возврата нового списка с новыми позициями.
Эта линия
возвращает список этого типа:
Мы рассчитываем расстояния до свободных точек и добавляем случайность. Потому что
ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')
мы можем сказать, что ближайший "." для n = 7 (индекс в списке) имеет индекс 8.Пример:
источник
','
(что имеет место в тестовых примерах 2, 3 и 5). 2) Ваш формат ввода / вывода не такой, как в вопросе. Пожалуйста, укажите ваш формат ввода / вывода.f(9, ...
не работает - он помещает символ в 2, но самые близкие позиции к 9 - это 6 и 8, поэтому один из них должен выбираться случайным образом (в вашем коде также нет случайности). Кроме того, он должен обойти периметр, находя ближайший ближайший, поэтомуf(9,list("####@#.##"))
следует поместить персонажа в единственно возможное место (7 здесь).f(9, ...
должен вернутьсяlist("#....##@#")
(потому что 8 свободен и рядом с 9). 2. Нечто подобноеf(9,list("####@.#.#"))
должно иметь некоторый шанс вернутьсяlist("####..#@#")
(не всегдаlist("####.@#.#")
), как указано «Если оба направления открыты, выберите одно, чтобы перейти к случайному направлению».