Skaczemy po wieżach

17

Zadanie

Biorąc pod uwagę tablicę liczb całkowitych nieujemnych a, określ minimalną liczbę skoków w prawo wymaganych do przeskoku „poza” tablicę, zaczynając od pozycji 0, lub zwróć zero / null, jeśli nie jest to możliwe.

Skok z indeksu iokreśla się zwiększenie indeksu tablicy co najwyżej a[i].

Skoku na zewnątrz jest skok gdzie indeks wynikające ze skokiem iznajduje się aut do tablicy, to do indeksowania 1 opartej na i>length(a)i do indeksowania 0 opartym i>=length(a).

Przykład 1

Zastanów się 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

Najkrótsza ścieżka „skakania”, by wyjść poza boisko, ma długość 2:

Możemy skakać z 0->2->4->outsidektórej ma długość, 3ale 0->4->outsidema długość, 2więc wracamy 2.

Przykład 2

Załóżmy 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

W takim przypadku nie można wyskoczyć poza tablicę, dlatego powinniśmy zwrócić zero / null lub dowolną niedeterministyczną wartość jak .

Przykład 3

Załóżmy Array=[4]:

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

Możemy bezpośrednio skoczyć z indeksu 0 poza tablicę za pomocą jednego skoku, więc wracamy 1.

Edytować:

Ze względu na wiele pytań dotyczących wartości zwracanej: Zwrot jest całkowicie ważny, jeśli nie ma szans na ucieczkę. Ponieważ, jeśli istnieje szansa, możemy zdefiniować tę liczbę.

To jest , więc wygrywa najkrótszy kod w bajtach!

0x45
źródło
9
Ponadto, należy rozważyć przy użyciu piaskownicy dla wyzwań! Wiele z tych obaw mogło zostać rozwiązanych wcześniej, gdybyś tam napisał.
Giuseppe
3
Powiązane , powiązane .
Mr. Xcoder
3
@ 0x45 Jakie założenie? Fakt, że połączyłem cię z niektórymi pokrewnymi wyzwaniami? Nigdy nie powiedziałem duplikatu . Nie jestem pewien co masz na myśli.
Pan Xcoder
10
@ 0x45, przyjmij dobre intencje . Zadajemy te pytania nie dlatego, że próbujemy wyśmiewać się z twojego wyzwania. Wręcz przeciwnie: interesujemy się twoim wyzwaniem. Pomyśl tylko o tym, dlaczego zadawalibyśmy pytania wyjaśniające, jeśli nie podobało nam się Twoje wyzwanie? W tym celu mamy głosy oddania / zamknięcia. (I jak widzę, nikt nie ocenił twojego postu!)
JungHwan Min
13
Dobrze byłoby mieć przypadek testowy, w którym łapczywe przeskakiwanie maksymalnej odległości na każdym kroku nie jest optymalne. Na przykład [2, 3, 1, 1].
Martin Ender

Odpowiedzi:

4

Łuska , 9 bajtów

Γö→▼Mo₀↓ŀ

Zwraca, Infgdy nie ma rozwiązania. Wypróbuj online!

Wyjaśnienie

Przydają się tutaj domyślne wartości powrotu Husky.

Γö→▼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

Jeśli lista wejściowa jest pusta, Γnie można jej zdekonstruować, więc zwraca domyślną wartość całkowitą, 0. Jeśli pierwszym elementem jest 0, wynikiem Mo₀↓ŀjest pusta lista, na której zwraca nieskończoność.

Zgarb
źródło
6

Haskell , 70 58 bajtów

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

Wypróbuj online!

EDYCJA: -12 bajtów dzięki @Esolanging Fruit i OP za decyzję o zezwoleniu na nieskończoność!

Zwraca, Infinitygdy nie ma rozwiązania, które znacznie upraszcza rozwiązanie. Ponieważ możemy poruszać się tylko do przodu, fwystarczy spojrzeć na nagłówek listy, upuścić 1<=k<=xelementy z listy i powtórzyć. Następnie dodajemy po 1 do każdego rozwiązania znalezione połączenia rekurencyjne i przyjmujemy minimum. Jeśli głowa ma wartość 0, wynikiem będzie nieskończoność (ponieważ nie możemy się ruszyć, nie ma rozwiązania). Ponieważ 1+Infinity==Infinityten wynik zostanie przeniesiony z powrotem do dzwoniących. Jeśli lista jest pusta, oznacza to, że opuściliśmy tablicę, więc zwracamy koszt 0.

użytkownik1472751
źródło
1
58 bajtów , ale tylko jeśli zezwolisz Infinityjako wartość zerowa (czego OP jeszcze nie wyjaśnił).
Esolanging Fruit
W rzeczywistości OP na to zezwolił, więc powinno to być prawidłowe.
Esolanging Fruit
3

Python 2 , 124 bajty

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

Wypróbuj online!

-11 bajtów dzięki Mr. Xcoder
-12 bajtów dzięki Mr. Xcoder i Rod

HyperNeutrino
źródło
Nie udało print(f([4,1,0,4,1,1,1]))Ci się wrócić 3, ale powinno być 2jak[0] -> [3] -> outside
0x45
@ 0x45 jak to ... czekaj, kiedy skaczesz, czy musisz skakać tak daleko, jak to możliwe, czy gdzieś pomiędzy?
HyperNeutrino
@ Mr.Xcoder o tak, tak. również dzięki za -~podstęp, zapomniałem o tym.
HyperNeutrino
@HyperNeutrino „Skok z indeksu i jest definiowany jako wzrost indeksu tablicy o najwyżej [i].”
Martin Ender
1
@ 0x45 ok, dziękuję za wyjaśnienie. Myślę, że to naprawiłem
HyperNeutrino
3

APL (Dyalog Classic) ngn / apl , 18 bajtów

EDYCJA: przełączono na moją własną implementację APL, ponieważ Dyalog nie obsługuje nieskończoności, a autor wyzwania nie pozwala, by skończone liczby działały jako „zerowe”

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

Wypróbuj online! spróbuj na stronie demo ngn / apl

zwraca brak rozwiązania⌊/⍬

ngn
źródło
Jaki jest „właściwy argument” ??
Erik the Outgolfer
Wyzwanie to rozpaczliwie potrzebuje lepszych przypadków testowych. Ale twoje rozwiązanie jest nieprawidłowe, na przykład 2 3 1 1powinno być mapowane na2
H.PWiz
@EriktheOutgolfer, 0Nktóry jest liczbą całkowitą k null; jeśli jesteś zainteresowany, mogę wyjaśnić dalej w pokoju apl
ngn
@ H.PWiz teraz może sobie z tym poradzić
ngn
3

Haskell , 45 bajtów

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

Wypróbuj online!

Wysyła, Infinitygdy jest to niemożliwe. Pomocniczy lewy argument do %śledzenia, o ile więcej przestrzeni możemy przesunąć w naszym bieżącym przeskoku.

xnor
źródło
2

Perl 5 , 56 53 bajtów

Obejmuje +1dlaa

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

Tylko kod:

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

Wypróbuj online!

Ton Hospel
źródło
1

Galaretka , 32 bajty

ṛ/ṆȧJ’Ṛ
Rḟ"ÇƤZ$$Tị$Œp+\€Ṁ<Li0ȧ@Ḣ

Wypróbuj online!

To jest po prostu za długo ...

Erik the Outgolfer
źródło
1

Galaretka , 19 18 bajtów

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

Wypróbuj online!

Wyjaśnienie

<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
mile
źródło
1

JavaScript ES6 , 118 bajtów

(x,g=[[0,0]])=>{while(g.length){if((s=(t=g.shift())[0])>=x.length)return t[1];for(i=0;i++<x[s];)g.push([s+i,t[1]+1])}}

Wypróbuj online!

Wykonuje pierwsze wyszukiwanie szerokości tablicy, aby znaleźć najkrótszą ścieżkę.

Fəˈnɛtɪk
źródło
0

Julia 0.6 , 79 bajtów

Zwraca liczbę skoków lub Infjeśli nie możesz uciec. Spójrz rekurencyjnie na pierwszy element i albo wróć, Infalbo w 1zależności od tego, czy możesz uciec, w przeciwnym razie dodaj 1do najkrótszego rozwiązania dla przyciętych tablic reprezentujących każdy prawidłowy skok. Przepływ sterowania odbywa się za pomocą dwóch instrukcji trójskładnikowych, takich jak 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)

Wypróbuj online!

gggg
źródło
0

C # (.NET Core) , 97 bajtów

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;}

Wypróbuj online!

Zwraca 0, jeśli nie znaleziono ścieżki.

Wyjaśnienie

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.
    }
raznagul
źródło
0

Python 2 , 83 73 72 bajty

-10 dzięki @ user202729
-1 dzięki @JonathanFrech

lambda a:a and(a[0]and-~min(f(a[k+1:])for k in range(a[0]))or 1e999)or 0

Wypróbuj online! Zwraca nieskończoność dla wartości pustej.

Esolanging Fruit
źródło
and min(...)+1formoże być and-~min(...)for.
Jonathan Frech
@JathanathanFrech Edytowane.
Esolanging Fruit