우리는 탑 호핑을한다


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

범위를 벗어나는 "점프"에 의한 최단 경로 길이 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

이 경우 배열 외부로 점프 할 수 없으므로 0 / null 또는 결정적이지 않은 값을 반환해야합니다. .

실시 예 3

가정 Array=[4]:

Array[0] = 4 -> You can jump 4 field

한 번만 점프하면 인덱스 0에서 배열 외부로 직접 점프 할 수 있습니다. 1 합니다.

편집하다:

반환 값에 대한 여러 가지 질문으로 인해 : 탈출 할 기회가없는 경우 반환 은 완전히 유효합니다. 기회가 있다면 그 숫자를 정의 할 수 있기 때문입니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


9
또한 도전에 샌드 박스 사용을 고려 하십시오! 당신이 거기에 게시했다면 이러한 우려의 대부분은 이전에 해결되었을 수 있습니다.
주세페


3
@ 0x45 어떤 가정? 내가 당신을 관련 문제에 연결했다는 사실? 나는 결코 중복 이라고 말하지 않았다 . 무슨 말인지 잘 모르겠습니다.
Mr. Xcoder

10
@ 0x45 좋은 의도가정 하십시오 . 우리는 당신의 도전을 즐기려고하기 때문에 이러한 질문을 하지 않습니다 . 사실, 그것은 정반대입니다. 우리는 당신의 도전에 관심이 있습니다. 우리가 당신의 도전을 싫어한다면 왜 분명한 질문을합니까? 우리는 그러한 목적으로 투표 / 닫기 투표를합니다. (내가 아는 것처럼, 아무도 당신의 게시물을
공감

13
모든 단계에서 최대 거리를 탐욕스럽게 점프하는 것이 최적이 아닌 테스트 케이스를 갖는 것이 좋습니다. 예를 들면 [2, 3, 1, 1].
Martin Ender 2019

답변:


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

하스켈 , 70 58 바이트

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

온라인으로 사용해보십시오!

편집 : @Esolanging Fruit 및 무한을 허용하기로 결정한 OP 덕분에 -12 바이트!

보고 Infinity솔루션을 더 단순하게 만드는 솔루션이 없을 때 됩니다. 앞으로 만 이동할 수 있기 때문에 f목록의 헤드 1<=k<=x만보고 목록에서 항목을 삭제 하고 되풀이합니다. 그런 다음 재귀 호출에서 찾은 각 솔루션에 1을 추가하고 최소값을 취합니다. 헤드가 0이면 결과는 무한대입니다 (우리가 이동할 수 없기 때문에 해결책이 없습니다). 때문에 1+Infinity==Infinity이 결과는 발신자에게 다시 수행 할 것입니다. 목록이 비어 있으면 배열을 떠났으므로 비용 0을 반환합니다.


1
58 바이트 이지만 InfinityOP가 아직 명확하지 않은 null 값으로 허용 하는 경우에만 해당됩니다 .
Esolanging Fruit

실제로 OP는 이제이를 허용하므로 유효해야합니다.
Esolanging 과일

3

파이썬 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

온라인으로 사용해보십시오!

Mr. Xcoder 덕분에 -11 바이트
Mr. Xcoder와 Rod 덕분에 -12 바이트


당신은 실패 print(f([4,1,0,4,1,1,1]))당신은 반환 3되어야하지만 2처럼[0] -> [3] -> outside
0x45

@ 0x45 어떻게 그렇게 ... 잠깐만, 점프 할 때, 가능한 한 멀리 점프해야합니까?
HyperNeutrino

@ Mr.Xcoder 아, 그래. -~트릭에 감사드립니다 . 그 점을 잊어 버렸습니다.
HyperNeutrino

@HyperNeutrino "인덱스 i로부터의 점프는 배열 인덱스가 최대 [i] 만큼 증가한 것으로 정의됩니다 ."
Martin Ender 2019

1
@ 0x45 알았어요. 설명해 주셔서 감사합니다. 나는 그것을 고쳤다 고 생각한다
HyperNeutrino

3

APL (Dyalog Classic) ngn / apl , 18 바이트

편집 : Dyalog는 무한대를 지원하지 않으며 도전 과제 작성자 유한 숫자가 "널"로 작동 하도록 허용 하지 않기 때문에 자체 APL 구현으로 전환했습니다.

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

온라인으로 사용해보십시오! ngn / apl의 데모 페이지에서 사용해보십시오

해결책없이 돌아온다⌊/⍬


"올바른 논쟁"은 ?무엇입니까?
Erik the Outgolfer

이 과제는 더 나은 테스트 사례가 절실히 필요합니다. 그러나 솔루션은 예를 들어 무효 2 3 1 1로 매핑되어야한다2
H.PWiz

0Nk의 정수 널인 @EriktheOutgolfer ; 당신이 관심이 있다면, 나는 apl 방에서 더 설명 할 수 있습니다
ngn

@ H.PWiz는 이제 그것을 다룰 수 있습니다
ngn





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 코어) , 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.
    }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.