Цель этой задачи - написать программу или функцию, которая возвращает наименьшее количество ударов, необходимых для прохождения данного курса.
вход
- Макет курса может быть принят любым подходящим способом и форматом, который вы предпочитаете. (чтение из консоли, передача в качестве входного параметра, чтение из файла или любого другого, многострочная строка, строковый массив, двумерный символьный / байтовый массив).
- Начальная позиция мяча и лунки также может быть передана в качестве входных данных, ее не нужно анализировать с входных данных. В тест-кейсах они включены в курс, чтобы убедиться, что нет никакой путаницы относительно фактической позиции.
- Вы можете переназначить входные символы во что-то другое, если они по-прежнему распознаются как отдельные символы (например, печатаемые символы ASCII).
Выход
- Программа должна возвращать наименьший возможный балл (наименьшее количество ударов, необходимых для достижения дыры) для любого курса, переданного в качестве ввода в разумном формате (строка, целое число, число с плавающей запятой или хайку, описывающие результат)
- Если курс невозможно пройти , вернитесь
-1
(или любое другое ложное значение по вашему выбору, которое не будет возвращено для пройденного курса).
Пример:
В этом примере позиции обозначены как 0, X / Y, слева направо, сверху вниз, но вы можете использовать любой формат, который вам нравится, так как результат в любом случае полностью независим от формата.
Входные данные:
###########
# ....#
# ...#
# ~ . #
# ~~~ . #
# ~~~~ #
# ~~~~ #
# ~~~~ o #
# ~~~~ #
#@~~~~ #
###########
Ball (Start-Position): 1/9
Hole (End-Position): 8/7
Выход:
8
Правила и поля
Курс может состоять из следующих полей:
'@'
Ball - начало курса'o'
Дыра - цель курса'#'
Стена - мяч остановится, когда ударится о стену'~'
Вода - нужно избегать'.'
Песок - мяч немедленно остановится на песке' '
Лед - мяч будет продолжать скользить, пока не достигнет чего-то
Основные правила и ограничения игры:
- Мяч не может двигаться по диагонали, только влево, вправо, вверх и вниз.
- Мяч не остановится перед водой, только перед стенами, на песке и в отверстии.
- Выстрелы в воду недопустимы / невозможны
- Мяч останется в лунке, а не пропустит его, как на льду
- Курс всегда прямоугольный.
- Курс всегда ограничен водой или стенами (проверка границ не требуется).
- Всегда есть ровно один мяч и одна лунка.
- Не все курсы можно обыграть.
- Может быть несколько путей, которые приводят к одному и тому же (наименьшему) количеству баллов.
Лазейки и условия победы
- Стандартные лазейки запрещены
- Программы должны прекратить
- Вы не можете придумать дополнительные правила (удары по мячу так сильно, что он пропускает воду, отскакивает от стены, прыгает по песчаным полям, изгибается по углам и т. Д.)
- Это код-гольф , поэтому выигрывает решение с наименьшим количеством символов.
- Решения должны быть в состоянии обработать все предоставленные тестовые примеры, если это невозможно из-за ограничений используемого языка, укажите это в своем ответе.
Контрольные примеры
Курс № 1 (2 удара)
####
# @#
#o~#
####
Курс № 2 (невозможно)
#####
#@ #
# o #
# #
#####
Курс № 3 (3 удара)
~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~
Курс № 4 (2 удара)
#########
#~~~~~~~#
#~~~@~~~#
## . ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########
Курс № 5 (невозможно)
~~~~~~~
~... ~
~.@.~.~
~... ~
~ ~ ~.~
~ . .o~
~~~~~~~