我们跳塔


17

任务

给定一个非负整数数组a,请确定从数组0处“跳出”数组所需的向右跳转的最小次数,从位置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

通过“跳跃”越界的最短路径为length 2

我们可以从0->2->4->outside有长度30->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先生18年

10
@ 0x45请保持良好的意愿。我们问这些问题不是因为我们试图取笑您的挑战。实际上,情况恰恰相反:我们对您的挑战很感兴趣。试想一下,如果我们不喜欢您的挑战,为什么还要提出澄清的问题?我们为此目的有不赞成票/不公开票。(据我
所知

13
最好有一个测试用例,其中贪婪地跳跃每一步的最大距离并不是最佳的。例如[2, 3, 1, 1]
Martin Ender '18

Answers:


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

Haskell70 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从列表中删除项目并重复。然后,我们只需将找到的递归调用加到每个解决方案中,然后取最小值即可。如果head为0,结果将是无穷大(因为我们不能移动,所以没有解)。由于1+Infinity==Infinity此结果将被带回给呼叫者。如果列表为空,则意味着我们离开了数组,因此返回的成本为0。


1
58个字节,但仅当您允许Infinity为空值时(OP尚未阐明)。
硕果累累'18

实际上,OP现在已允许这样做,因此应该是有效的。
硕果累累'18

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

在线尝试!

Xcoder先生提供-11个
字节Xcoder和Rod 先生提供了-12个字节


您失败了print(f([4,1,0,4,1,1,1]))您返回了3,但应该2[0] -> [3] -> outside
0x45

@ 0x45怎么...等等,当您跳跃时,您是否必须跳得尽可能远或介于两者之间?
HyperNeutrino

@Xcoder先生哦,是的。也谢谢你的-~把戏,忘了那个。
HyperNeutrino

“ @HyperNeutrino”从索引i的跳转被定义为数组索引最多增加a [i]。
Martin Ender '18

1
@ 0x45好的,感谢您的澄清。我想我已解决问题
-HyperNeutrino,

3

APL(Dyalog Classic)ngn / apl,18字节

编辑:切换到我自己的APL实现,因为Dyalog不支持无限,并且挑战作者不允许有限数字充当“空”

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

在线尝试! 在ngn / apl的演示页面上尝试

没有解决的回报⌊/⍬


什么是“正确的论点” ?
暴民埃里克(Erik the Outgolfer)'18年

迫切需要更好的测试用例。但是您的解决方案无效,例如2 3 1 1应映射到2
H.PWiz

@EriktheOutgolfer 0N,它是k的整数null;如果您有兴趣,我可以在apl室中进一步解释
ngn

@ H.PWiz现在它可以处理这个
NGN

3

Haskell,45个字节

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

在线尝试!

Infinity在不可能时输出。左辅助参数用于%跟踪当前跳中可以移动多少空间。


2

Perl的556 53个字节

包括+1用于a

perl -aE '1until-@F~~%v?say$n:$n++>map\@v{$_-$F[-$_]..$_},%v,0'  <<< "4 0 2 0 2 0"; echo

只是代码:

#!/usr/bin/perl -a
1until-@F~~%v?say$n:$n++>map\@v{$_-$F[-$_]..$_},%v,0

在线尝试!




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字节

返回跳转数或Inf您无法逃脱的次数。递归地查看第一个元素,然后返回Inf1取决于是否可以转义,否则将其添加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.
    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.