Вы находитесь на передовой межгалактической космической станции. Ваш друг, который работает в «Изучении гравитации», только что создал игру, в которой микрогравитация используется для перемещения мяча.
Она вручает вам маленький контроллер с четырьмя стрелками на нем и лабиринтную конструкцию с мячом, сидящим слева. Она начинает объяснять, как работает игра.
- У вас есть 2 кнопки со стрелками, слева
<
и справа>
. - У вас также есть 2 кнопки гравитации, вверх
^
и внизv
(по крайней мере, от вашей системы отсчета) - Вы будете использовать эти кнопки со стрелками для перемещения мяча на экране.
«Теперь есть некоторые правила, которые необходимо соблюдать». она говорит
- Все платформы должны быть пройдены, прежде чем добраться до чашки
\ /
- Стрелки
< > ^ v
будут использоваться для указания движения мяча - Гравитация есть
^ v
(вверх и вниз). Это перемещает мяч до следующей платформы в этом направлении. (Расстояние не рассчитывается для вверх и вниз) - Потерять мяч - это плохо! Не падайте через край и не переключайте гравитацию слишком рано, чтобы ваш мяч никогда не достиг платформы
- Движение считается по шагам
< >
- Мяч может войти в чашку с любого направления, если следовать правилу 1
- Вы должны указать направление гравитации, чтобы ваш шар не уплыл
- Движение может быть случайным, если следовать правилу 1 и 4
- Для случаев, которые не могут быть решены, выведите False или Invalid
Простой пример мяча, платформы и чашки:
v
o
---\ /
v>
o
---\ /
v>>
o
---\ /
v>>>
o
---\ /
v>>>>
---\o/
Пример обхода через ту же платформу снова.
v
o
----
\ /-------
v>
o
----
\ /-------
v>>
o
----
\ /-------
v>>>
o
----
\ /-------
v>>>>
----
o
\ /-------
v>>>>>
----
o
\ /-------
v>>>>>>
----
o
\ /-------
v>>>>>>>
----
o
\ /-------
v>>>>>>>>
----
o
\ /-------
v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup
----
\o/-------
Пример переключения гравитации
v
--/ \
o
----
v>
--/ \
o
----
v>>
--/ \
o
----
v>>>
--/ \
o
----
v>>>^
--/ \
o
----
v>>>^>
--/ \
o
----
v>>>^>>
--/ \
o
----
v>>>^>>>
--/o\
----
задача
Ваша задача - создать программу, которая будет использовать ASCII-представление курса в качестве входных данных. И выведите ряд стрелок, <>^v
представляющих направление и гравитационное притяжение, чтобы переместить шар o
через все platforms
в чашку.
Применяются стандартные правила игры в гольф
Тестовые случаи
Ввод (ситуация, когда гравитация переключается)
---- --/ \
--- --
o
------ -----
Выход
^>>v>>>>>^>>>>>v>>>>^>>>
Вход (ситуация, когда направление переключается)
---
o
----
---
-----
--\ /
Выход
v>>>>>>^>>>v<<<<<v>>>
Ввод (ситуация, когда вам нужно пройти через одну и ту же платформу дважды)
o
------
------
------
\ /------
Выход
v>>>>>><<<<<<>>>>>>><<<<<<
Bad Cases, программа должна выводить Falsy для этих
У мяча нет возможности добраться до следующей платформы
o
--- ---
Мяч упал бы в космос
---
o
---
Ситуация, когда мяч попадает в кубок, но все платформы не пересекаются.
o
----
----
\ /----
источник
Ответы:
Pyth, 431 байт
Это моя первая программа Pyth (на самом деле это моя первая программа на любом языке кода-гольфа), что означает, что ее, вероятно, еще можно улучшить.
Попробуйте это здесь (последний тестовый сценарий требует слишком много времени, он должен быть протестирован с локальной установкой Pyth).
Шестнадцатеричный дамп кода (используйте
xxd -r <filename>
для декодирования):объяснение
Основной идеей этой программы было использование регулярных выражений для изменения ввода. Для экономии места все эти регулярные выражения содержатся в сжатой строке. Первый шаг в программе - распаковать строку и разделить ее на одно регулярное выражение и соответствующие замещающие строки.
Содержимое переменной
J
тогда:Функция
r
применяет подстановки регулярных выражений из списка, сохраненного вJ
индексе,G
ко всем строкам в спискеH
. Он возвращается, как только любая из строк была изменена.Функция
i
похожа на функциюr
с двумя отличиями. Он применяет замены в транспонированном списке (вместо вертикального вместо горизонтального). Он также выполняет замены многократно, пока что-либо изменяется.Функция
g
проверяет, можно ли найти регулярное выражение из списка, хранящегося вJ
индексеG
, в любой строке спискаH
.Остальная часть кода содержит реальную логику программы. Он выполняет поиск возможных движений в ширину, пока не будет найдено решение. Положение в дереве поиска однозначно определяется направлением силы тяжести и измененной копией входных данных программы. Чтобы избежать обработки одной и той же позиции снова и снова, обработанные позиции сохраняются в глобальном списке
K
. Позиции, которые еще предстоит обработать, сохраняются вместе с соответствующей частью решения в спискеY
.Модификация ввода и инициализация
K
иY
выполняется следующим кодом:Модификация ввода делает что-то вроде следующего. Вход:
трансформируется в:
Значения имеют следующее значение:
-
Платформа, которую еще нужно посетить=
Платформа, которую больше не нужно посещатьM
Чашка, в которую можно ввести гравитацию, установленную на «вниз»W
Чашка, в которую можно ввести гравитацию, установленную на «вверх»V
Безопасно перемещаться в это место с гравитацией, установленной на «вниз»A
Безопасно перемещаться в это место с гравитацией, установленной на «вверх»X
Безопасно перемещаться в это место независимо от настроек гравитации6
Мяч на месте, которое будет помечено какV
9
Мяч на месте, которое будет помечено какA
0
Мяч на месте, которое будет помечено какX
Логика использует регулярные выражения для выполнения движений. В приведенном выше примере, если сила тяжести будет установлена на «вверх», мы можем заменить «9A» на «A9» с помощью регулярного выражения, чтобы переместить шар вправо. Это означает, что, пытаясь применить регулярное выражение, мы можем найти все возможные движения.
Функция
X
выполняет вертикальные движения шарика на основе текущего значения силы тяжести, сохраняют результат в глобальных спискахK
иY
, и проверяет , если решение было найдено.Функция
(
реализует проверки для 4 кнопок направления / гравитации. Кнопки гравитации можно нажимать только в том случае, если текущая сила тяжести изменится, и если мяч находится в безопасном месте, чтобы изменить гравитацию. Кнопки со стрелками можно нажимать только в том случае, если безопасно перейти в соответствующее место.Наконец основной цикл. Первый элемент
Y
удаляется неоднократно, и проверяются все возможные ходы.источник
Y
список будет пустым, всплывающее окно выдаст ошибку и#
цикл завершится.