задача
Дан массив неотрицательных целых чисел a
определите минимальное количество прыжков вправо, необходимое для перехода «вне» массива, начиная с позиции 0 или возврата нуля / нуля, если это невозможно сделать.
Скачок из индекса i
определяется как увеличение индекса массива не более чем на a[i]
.
Прыжок снаружи скачок , где индекс в результате скачки i
находится вне границ для массива, поэтому для индексации 1 на основе i>length(a)
, а также для индексации 0 на основе, i>=length(a)
.
Пример 1
Рассмотрим Array = [4,0,2,0,2,0]
:
Array[0] = 4 -> You can jump 4 field
Array[1] = 0 -> You can jump 0 field
Array[2] = 2 -> You can jump 2 field
Array[3] = 0 -> You can jump 0 field
Array[4] = 2 -> You can jump 2 field
Array[5] = 0 -> You can jump 0 field
Кратчайший путь путем «прыжка» для выхода за пределы имеет длину 2
:
Мы можем прыгать, у 0->2->4->outside
которого есть длина, 3
но 0->4->outside
есть длина, 2
поэтому мы возвращаемся 2
.
Пример 2
Предположим Array=[0,1,2,3,2,1]
:
Array[0] = 0 -> You can jump 0 fields
Array[1] = 1 -> You can jump 1 field
Array[2] = 2 -> You can jump 2 field
Array[3] = 3 -> You can jump 3 field
Array[4] = 2 -> You can jump 2 field
Array[5] = 1 -> You can jump 1 field
В этом случае невозможно выйти за пределы массива, поэтому мы должны вернуть ноль / ноль или любое недетерминированное значение, подобное ∞
.
Пример 3
Предположим Array=[4]
:
Array[0] = 4 -> You can jump 4 field
Мы можем напрямую перейти с индекса 0 за пределы массива всего одним прыжком, поэтому мы возвращаемся 1
.
Редактировать:
Из-за нескольких вопросов о возвращаемом значении: Возврат ∞
полностью действителен, если нет возможности сбежать. Потому что, если есть шанс, мы можем определить это число.
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
[2, 3, 1, 1]
.Ответы:
Шелуха , 9 байт
Возвращает,
Inf
когда решения не существует. Попробуйте онлайн!объяснение
Возвращаемые значения Husk по умолчанию здесь пригодятся.
Если входной список пуст, то
Γ
не может его деконструировать, поэтому он возвращает целочисленное значение по умолчанию, 0. Если первый элемент равен 0, то результатомMo₀↓ŀ
является пустой список, для которого▼
возвращается бесконечность.источник
Haskell ,
7058 байтПопробуйте онлайн!
РЕДАКТИРОВАТЬ: -12 байт благодаря @Esolanging Fruit и OP за решение разрешить бесконечность!
Возвращает,
Infinity
когда нет решения, которое делает решение намного проще. Поскольку мы можем двигаться только вперед,f
просто смотрит на начало списка, удаляет1<=k<=x
элементы из списка и повторяется. Затем мы просто добавляем 1 к каждому решению найденных рекурсивных вызовов и берем минимум. Если голова равна 0, результатом будет бесконечность (поскольку мы не можем двигаться, решения не существует). Так как1+Infinity==Infinity
этот результат будет возвращен звонящим. Если список пуст, это означает, что мы оставили массив, поэтому мы возвращаем стоимость 0.источник
Infinity
нулевое значение (которое ОП еще не уточнил).Python 2 , 124 байта
Попробуйте онлайн!
-11 байт благодаря мистеру Xcoder
-12 байт благодаря мистеру Xcoder и Роду
источник
print(f([4,1,0,4,1,1,1]))
вернулись. Вы вернулись3
, но должны быть2
как[0] -> [3] -> outside
-~
трюк, забыл об этом.APL (Dyalog Classic)нгн / апл , 18 байтРЕДАКТИРОВАТЬ: переключился на мою собственную реализацию APL, потому что Dyalog не поддерживает бесконечности, и автор задачи не позволяет конечным числам действовать как «ноль»
Попробуйте онлайн!попробуйте это на демонстрационной странице ngn / aplвозвращается без решения
⌊/⍬
∞
источник
?
?2 3 1 1
должно быть сопоставлено с2
0N
который является целым нулем k; если вам интересно, я могу объяснить дальше в комнатеHaskell , 45 байт
Попробуйте онлайн!
Выходы
Infinity
когда невозможно. Вспомогательный левый аргумент%
отслеживает, сколько еще пробелов мы можем переместить в нашем текущем прыжке.источник
Perl 5 ,
5653 байтаВключает
+1
в себя дляa
Просто код:
Попробуйте онлайн!
источник
Perl 5 , 80 байт
Попробуйте онлайн!
источник
Желе , 32 байта
Попробуйте онлайн!
Это слишком долго ...
источник
Желе ,
1918 байтПопробуйте онлайн!
объяснение
источник
JavaScript ES6 , 118 байт
Попробуйте онлайн!
Выполняет поиск в массиве в ширину, чтобы найти кратчайший путь.
источник
C (gcc) , 80 байтов
Попробуйте онлайн!
источник
Юлия 0,6 , 79 байт
Возвращает количество прыжков или,
Inf
если вы не можете убежать. Рекурсивно посмотрите на первый элемент и либо вернитесь,Inf
либо в1
зависимости от того, сможете ли вы убежать, в противном случае добавьте1
к кратчайшему решению для усеченных массивов, представляющих каждый допустимый переход. Поток управления осуществляется с помощью двух троичных операторов, таких какtest1 ? ontrue1 : test2 ? ontrue2 : onfalse2
.Попробуйте онлайн!
источник
C # (.NET Core) , 97 байт
Попробуйте онлайн!
Возвращает 0, если путь не найден.
объяснение
источник
Python 2 ,
837372 байта-10 спасибо @ user202729
-1 благодаря @JonathanFrech
Попробуйте онлайн! Возвращает бесконечность для нулевого значения.
источник
and min(...)+1for
возможноand-~min(...)for
.