Мы делаем прыжок с башни


17

задача

Дан массив неотрицательных целых чисел 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.

Редактировать:

Из-за нескольких вопросов о возвращаемом значении: Возврат полностью действителен, если нет возможности сбежать. Потому что, если есть шанс, мы можем определить это число.

Это , поэтому выигрывает самый короткий код в байтах!


9
Также, пожалуйста, рассмотрите возможность использования песочницы для ваших испытаний! Многие из этих проблем могли бы быть рассмотрены ранее, если бы вы опубликовали там.
Джузеппе


3
@ 0x45 Какое предположение? Тот факт, что я связал вас с некоторыми проблемами? Я никогда не говорил, дубликат . Я не совсем понимаю, что вы имеете ввиду.
г-н Xcoder

10
@ 0x45, пожалуйста, прими добрые намерения . Мы задаем эти вопросы не потому, что пытаемся высмеять ваш вызов. На самом деле, все наоборот: мы заинтересованы в вашем вызове. Подумайте об этом, зачем нам задавать уточняющие вопросы, если нам не понравился ваш вызов? Для этого у нас есть отрицательные / закрытые голоса. (И, как я вижу, никто не проголосовал за ваш пост!)
JungHwan Мин

13
Было бы хорошо иметь тестовый пример, в котором жадный прыжок на максимальном расстоянии на каждом шаге не оптимален. Например [2, 3, 1, 1].
Мартин Эндер

Ответы:


4

Шелуха , 9 байт

Γö→▼Mo₀↓ŀ

Возвращает, Infкогда решения не существует. Попробуйте онлайн!

объяснение

Возвращаемые значения Husk по умолчанию здесь пригодятся.

Γö→▼Mo₀↓ŀ  Implicit input: a list, say [2,3,1,1]
Γ          Deconstruct into head H = 2 and tail T = [3,1,1]
 ö         and feed them into this function:
        ŀ   Range from 0 to H-1: [0,1]
    Mo      For each element in range,
       ↓    drop that many element from T: [[3,1,1],[1,1]]
      ₀     and call this function recursively on the result: [1,2]
   ▼        Take minimum of the results: 2
  →         and increment: 3

Если входной список пуст, то Γне может его деконструировать, поэтому он возвращает целочисленное значение по умолчанию, 0. Если первый элемент равен 0, то результатом Mo₀↓ŀявляется пустой список, для которого возвращается бесконечность.


6

Haskell , 70 58 байт

f[]=0
f(0:_)=1/0
f(x:s)=minimum[1+f(drop k$x:s)|k<-[1..x]]

Попробуйте онлайн!

РЕДАКТИРОВАТЬ: -12 байт благодаря @Esolanging Fruit и OP за решение разрешить бесконечность!

Возвращает, Infinityкогда нет решения, которое делает решение намного проще. Поскольку мы можем двигаться только вперед, fпросто смотрит на начало списка, удаляет 1<=k<=xэлементы из списка и повторяется. Затем мы просто добавляем 1 к каждому решению найденных рекурсивных вызовов и берем минимум. Если голова равна 0, результатом будет бесконечность (поскольку мы не можем двигаться, решения не существует). Так как 1+Infinity==Infinityэтот результат будет возвращен звонящим. Если список пуст, это означает, что мы оставили массив, поэтому мы возвращаем стоимость 0.


1
58 байт , но только если вы допустите Infinityнулевое значение (которое ОП еще не уточнил).
Esolanging Fruit

На самом деле, OP теперь разрешил это, так что это должно быть действительным.
Esolanging Fruit

3

Python 2 , 124 байта

def f(a):
 i={0};l=len(a)
 for j in range(l):
	for q in{0}|i:
	 if q<l:i|=set(range(q-a[q],q-~a[q]))
	 if max(i)/l:return-~j

Попробуйте онлайн!

-11 байт благодаря мистеру Xcoder
-12 байт благодаря мистеру Xcoder и Роду


Вы не print(f([4,1,0,4,1,1,1]))вернулись. Вы вернулись 3, но должны быть 2как[0] -> [3] -> outside
0x45

@ 0x45 как же так ... подожди, когда ты прыгаешь, нужно ли прыгать как можно дальше или где-то посередине?
HyperNeutrino

@ Мистер Xcoder, да, да. Также спасибо за -~трюк, забыл об этом.
HyperNeutrino

@HyperNeutrino "Переход от индекса i определяется как увеличение индекса массива максимум на a [i]."
Мартин Эндер

1
@ 0x45 хорошо, спасибо за разъяснения. Я думаю, что я это исправил
HyperNeutrino

3

APL (Dyalog Classic) нгн / апл , 18 байт

РЕДАКТИРОВАТЬ: переключился на мою собственную реализацию APL, потому что Dyalog не поддерживает бесконечности, и автор задачи не позволяет конечным числам действовать как «ноль»

⊃⊃{⍵,⍨1+⌊/⍺↑⍵}/⎕,0

Попробуйте онлайн! попробуйте это на демонстрационной странице ngn / apl

возвращается без решения⌊/⍬


Что такое «правильный аргумент» ??
Эрик Outgolfer

Эта задача остро нуждается в лучших тестовых случаях. Но ваше решение недействительно, например, 2 3 1 1должно быть сопоставлено с2
H.PWiz

@EriktheOutgolfer, 0Nкоторый является целым нулем k; если вам интересно, я могу объяснить дальше в комнате
apl

@ H.PWiz теперь это может иметь дело с этим
нгн

3

Haskell , 45 байт

(1%)
0%_=1/0
a%(h:t)=min(1+h%t)$(a-1)%t
_%_=0

Попробуйте онлайн!

Выходы Infinityкогда невозможно. Вспомогательный левый аргумент %отслеживает, сколько еще пробелов мы можем переместить в нашем текущем прыжке.





1

Желе , 19 18 байт

<LḢ
ḊßÐƤṁḢḟ0‘Ṃµ1Ç?

Попробуйте онлайн!

объяснение

<LḢ  Helper link. Input: array
<    Less than
 L   Length
  Ḣ  Head - Returns 0 if its possible to jump out, else 1

ḊßÐƤṁḢḟ0‘Ṃµ1Ç?  Main link. Input: array
            Ç   Call helper link
             ?  If 0
           1      Return 1
                Else
          µ       Monadic chain
Ḋ                   Dequeue
 ßÐƤ                Recurse on each suffix
     Ḣ              Head of input
    ṁ               Mold, take only that many values
      ḟ0            Filter 0
        ‘           Increment
         Ṃ          Minimum



0

Юлия 0,6 , 79 байт

Возвращает количество прыжков или, Infесли вы не можете убежать. Рекурсивно посмотрите на первый элемент и либо вернитесь, Infлибо в 1зависимости от того, сможете ли вы убежать, в противном случае добавьте 1к кратчайшему решению для усеченных массивов, представляющих каждый допустимый переход. Поток управления осуществляется с помощью двух троичных операторов, таких как test1 ? ontrue1 : test2 ? ontrue2 : onfalse2.

f(a,n=endof(a))=a[1]<1?Inf:a[1]>=n?1:1+minimum(f(a[z:min(z+a[1],n)]) for z=2:n)

Попробуйте онлайн!


0

C # (.NET Core) , 97 байт

f=l=>{for(int c=l.Count,s=0,j=l[0];j>0;s=f(l.GetRange(j,c-j--)))if(s>0|j>=c)return s+1;return 0;}

Попробуйте онлайн!

Возвращает 0, если путь не найден.

объяснение

f = 
    l =>                                      //The list of integers
    {
        for (
            int c = l.Count,                  //The length of the list
                s = 0,                        //Helper to keep track of the steps of the recursion
                j = l[0];                     //The length of the jump, initialize with the first element of the list
                j > 0;                        //Loop while the jump length is not 0
                s = f(l.GetRange(j, c - j--)) //Recursive call of the function with a sub-list stating at the current jump length. 
                                              //Then decrement the jumplength. 
                                              //Returns the number of steps needed to jump out of the sup-list or 0 if no path was found. 
                                              //This is only executed after the first run of the loop body.
            )
        {
            if (j >= c |                      //Check if the current jump lengt gets you out of the list. 
                                              //If true return 1 (s is currently 0). OR
                s > 0 )                       //If the recursive call found a solution (s not 0) 
                                              //return the number of steps from the recursive call + 1
                return s + 1;
        }
        return 0;                             //If the jump length was 0 return 0 
                                              //to indicate that no path was found from the current sub-list.
    }

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.