Ваша жизнь может зависеть от этого. Не моргай Даже не моргай. Моргни и ты мертв. Они быстрые. Быстрее, чем ты можешь поверить. Не отворачивайся, не отводи взгляд и не моргай! Удачи.
Плачущие Ангелы - это инопланетная раса, которая не может двигаться, пока ее наблюдает другое существо (даже другой Ангел). Они питаются, отправляя своих жертв назад во времени. Вы ( Доктор ) попали в комнату с некоторыми, и вам нужно попасть в ТАРДИС.
задача
Напишите программу, которая при представлении ASCII прямоугольной комнаты выведет путь, который приведет вас к безопасности. Если любой Ангел может атаковать - в любое время во время вашего прогресса - тогда этот путь небезопасен. Ангел может атаковать, если он видит вас, когда вы не замечены ни вами, ни другим Ангелом.
вход
Вход состоит из двух частей. Во-первых, направление, с которым вы сталкиваетесь (NSEW). Затем в последующих строках - представление о комнате с указанием местоположения начала / конца и местоположения / облицовки всех Ангелов.
Пример ниже показывает, что есть один ангел, смотрящий на запад, и вы начинаете смотреть на юг.
S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
.
- Пустое пространствоD
- Доктор (исходная позиция)T
- ТАРДИС (конечная позиция)N,S,E,W
- Ангел, смотрящий в указанном направлении (север, юг, восток, запад)
Поле зрения
Вы можете увидеть любое пространство под углом 45 градусов в том направлении, в котором вы находитесь. Линия обзора затруднена, если есть другой объект по прямой горизонтальной, вертикальной или 45-градусной диагонали. Любая другая диагональ не мешает обзору. Линия зрения ангелов работает точно так же. Например, в следующем, -
представляет ваше поле зрения, предполагая, что вы обращены на юг.
........
...D....
..---...
.-----..
-------.
---N----
---.--N-
---.----
Выход
Выводом является строка, представляющая путь, по которому вы пойдете, чтобы выйти. Если существует несколько безопасных путей, выберите любой. Если ни один путь не является безопасным, выведите 0
. Если карта искажена, делайте все, что угодно, в том числе сбой. Считайте, что это уродливо, если комната не прямоугольная, нет выхода и т. Д. Если нет Ангелов, это не уродливо, просто легко.
Для каждого шага вы можете сделать одно из двух: двигаться в направлении NSEW или поворачиваться в направлении NSEW (не меняя положения). Для перемещения просто выведите букву для этого направления. Чтобы повернуться лицом к направлению, выведите F
соответствующую букву. Например, следующий вывод:
SSFESSSSSSSW
является безопасным путем для образца, указанного в разделе ввода. Вы двинетесь на юг дважды, поверните на восток, чтобы держать ангела в поле зрения, затем двиньтесь на юг еще семь раз и на запад один раз, чтобы войти в ТАРДИС.
Тестовые случаи
1) Вы можете обойти ангела, обращенного на восток, чтобы добраться до ТАРДИС. Если вы не встанете прямо между ними, они заблокируют друг друга на месте, поэтому не имеет значения, в каком направлении вы находитесь в любой точке.
W
...D....
........
........
........
.E.....W
........
........
...T....
2) Вы проигрываете. Нет способа пройти мимо них. Они могут видеть друг друга, пока вы не встанете между ними. В этот момент вы не можете столкнуться с ними обоими, и все готово. Можно просто закрыть глаза и покончить с этим.
S
...D....
........
........
........
E......W
........
........
...T....
выигрыш
Применяются стандартные правила игры в гольф и лазейки , выигрывает минимум байт. Я постараюсь в ближайшее время получить еще несколько тестов, но не стесняйтесь предлагать свои собственные.
Изображение и цитата из Доктора Кто.
J
).Ответы:
Питон -
559 565 644633Ввод должен быть представлен следующим образом:
По сути, именно этот подход применяется для нахождения всех состояний (положения и направления), которые Доктор может благополучно достичь, запоминания того, как он туда попал, и распечатывания пути в случае успеха. Позиции и направления реализуются с помощью комплексных чисел.
Я мог бы, вероятно, сохранить некоторые символы, используя сложную арифметику Мудреца, но это будет очень долго.
Сначала я подумал, что смогу спасти шесть символов, заставив Доктора повернуть в определенном направлении после достижения Тардис, но я понял, что это может привести к неправильным решениям. Также я сначала неправильно понял правила.
Вот в основном негольфированная версия:
Тестовые случаи
Тестовый пример 1:
Контрольный пример 2:
Тестовый пример VisualMelon:
источник
C #
17712034196218871347 байтПереписал блокировку проверки LOS за 1 цикл, сделав ее намного более аккуратной и примерно на 450 байт короче
Это полная программа, которая ожидает, что ввод завершится EOF и будет передан в STDIN. Он (надеюсь) печатает кратчайший путь к ТАРДИС или «0», если пути не существует. Он использует некачественный поиск в ширину, чтобы следовать всем возможным маршрутам, а затем возвращается назад от ТАРДИС к Доктору, чтобы собрать выходные данные.
Форматированный код:
Вывод для примера ввода
Выход для тестового примера 1)
Выход для теста 2)
По запросу я представляю новый тестовый пример:
Моя программа выводит
Тестовый пример WozzeC 1:
Тестовый пример WozzeC 2:
источник
C #
1454, 1396, 1373, 1303,1279Правильно. Поэтому я решил попробовать, и мальчик занял какое-то время. Он построен в основном с использованием логических операторов.
Чтобы не проверять наличие нулевого значения и т. Д., Я решил использовать поле [MAX_SIZE * 3] * [MAX_SIZE] * 3 и расположить игровое поле ближе к центру.
Циклические проверки выполняются внутри и снаружи до 50 (MAX_SIZE). Так что-то вроде этого:
Когда EWS или N найдены, я делаю ту же проверку с их стороны. Если что-то найдено, глядя на Ангелов (не Доктора), они возвращают 15 в качестве свободного прохода. Если на них не смотрят, они возвращаются, и Доктор должен быть в безопасности. то есть N вернул бы 2 на юг. Если это не NW или NE, в этом случае он вернет 6 (2 + 4) и 10 (2 + 8) соответственно.
Если двое ангелов наблюдают за Доктором, возвращаемые значения будут «И», поэтому в тестовом примере 2 положения 4 И 8 будут превращаться в 0. Это означает, что позиция плохая и ее следует избегать.
Расширенный код:
Результаты теста
1 Пример: FNSSSWNNNWSSSWSSSSENNESES
2 Пример: выхода нет
Пример VisualMelon: FNSSSSSSSWNNNNNNNWSSSSSSSSSEEEE
Мой тестовый случай1: FSSENEEEFWSSFNSWWN
Мой тестовый пример2: FSEEEESFWSSSSFNWWWWNFENNFSEES
Как видно, мой Доктор любит ходить, как душ, чтобы показать Ангелам, как весело передвигаться. Я могу заставить программное обеспечение найти кратчайший путь, но это занимает больше времени и требует больше кода.
Тестовые случаи для вас, ребята
Другой:
источник
using S=System.Console;
, или вы можете просто полностью удалить S в своем коде и сэкономить 6 байтusing System
. Теперь мне нужно еще немного урезать свой наивный подход ...;)