Цель этой задачи - написать программу или функцию, которая возвращает наименьшее количество ударов, необходимых для прохождения данного курса.
вход
- Макет курса может быть принят любым подходящим способом и форматом, который вы предпочитаете. (чтение из консоли, передача в качестве входного параметра, чтение из файла или любого другого, многострочная строка, строковый массив, двумерный символьный / байтовый массив).
- Начальная позиция мяча и лунки также может быть передана в качестве входных данных, ее не нужно анализировать с входных данных. В тест-кейсах они включены в курс, чтобы убедиться, что нет никакой путаницы относительно фактической позиции.
- Вы можете переназначить входные символы во что-то другое, если они по-прежнему распознаются как отдельные символы (например, печатаемые символы 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~
~~~~~~~
Ответы:
JavaScript (ES6), 174 байта
Принимает входные данные в синтаксисе
керлингакарри([x, y])(a)
, где x и y - это 0-индексированные координаты начальной позиции, а a [] - матрица целых чисел, где0
= ice,1
= wall,2
= sand,3
= hole и4
= waterВозвращает,
0
если нет решения.Попробуйте онлайн!
комментарии
источник
Python 3 , 273 байта
Попробуйте онлайн!
-41 байт благодаря ovs
-1 байт благодаря Джонатану Фреху
источник
if k+1
может бытьif-~k
?C #,
461418 байтЭто просто неконкурентная эталонная реализация, чтобы (надеюсь) возродить эту проблему:
Гольф от Кевина Круйссена
Ungolfed
Попробуйте онлайн
источник
int P(string[]C){int w=C[0].Length,i=0,l=c.Length;var c=string.Join("",C);var h=new int[l];for(var n=new List<int>();i<l;n.Add(i++))h[i]=c[i]!='@'?int.MaxValue:0;for(i=1;;i++){var t=n;n=new List<int>();foreach(int x in t){foreach(int d in new[]{-1,1,-w,w}){for(int j=x+d;c[j]==' ';j+=d);if(c[j]=='#'&h[j-d]>s){h[j-d]=s;n.Add(j-d);}if(c[j]=='.'&h[j]>s){h[j]=s;n.Add(j);}if(c[j]=='o')return s;}}if(n.Count<1)return -1;}}
(418 байт). Кроме того, не могли бы вы добавить TIO-ссылку с тестовым кодом?