Facciamo il salto della torre


17

Compito

Dato un array di numeri interi non negativi a, determinare il numero minimo di salti a destra necessari per saltare "all'esterno" dell'array, iniziando dalla posizione 0 o restituendo zero / null se non è possibile farlo.

Un salto dall'indice iè definito come un aumento dell'indice dell'array al massimo a[i].

Un salto all'esterno è un salto in cui l'indice risultante dal salto iè fuori limite per l'array, quindi per l'indicizzazione basata su 1 i>length(a)e per l'indicizzazione basata su 0 i>=length(a).

Esempio 1

Considera 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

Il percorso più breve "saltando" per uscire dai limiti ha una lunghezza 2:

Potremmo saltare da 0->2->4->outsidecui ha lunghezza 3ma 0->4->outsideha lunghezza 2quindi torniamo 2.

Esempio 2

Supponiamo che 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

In questo caso, è impossibile saltare fuori dall'array, quindi dovremmo restituire uno zero / null o qualsiasi valore non deterministico come .

Esempio 3

Supponiamo che Array=[4]:

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

Possiamo saltare direttamente dall'indice 0 all'esterno dell'array, con un solo salto, quindi torniamo 1.

Modificare:

A causa di più domande sul valore di ritorno: il reso è totalmente valido, se non c'è possibilità di scappare. Perché, se esiste una possibilità, possiamo definire quel numero.

Questo è , quindi vince il codice più corto in byte!


9
Inoltre, considera l'utilizzo della sandbox per le tue sfide! Molte di queste preoccupazioni potrebbero essere state affrontate in precedenza se le avessi postate lì.
Giuseppe,


3
@ 0x45 Quale ipotesi? Il fatto che ti abbia collegato ad alcune sfide correlate? Non ho mai detto duplicati . Non sono sicuro di cosa tu voglia dire.
Mr. Xcoder,

10
@ 0x45, si prega di assumere buone intenzioni . Stiamo ponendo queste domande non perché stiamo cercando di prendere in giro la tua sfida. In realtà, è esattamente il contrario: siamo interessati alla tua sfida. Basti pensare a questo, perché dovremmo porre domande di chiarimento se non abbiamo apprezzato la tua sfida? Abbiamo i voti negativi / voti stretti a tale scopo. (E come vedo, nessuno ha votato per il tuo post!)
JungHwan Min

13
Sarebbe bello avere un caso di prova in cui saltare avidamente la massima distanza ad ogni passo non è ottimale. Per esempio [2, 3, 1, 1].
Martin Ender,

Risposte:


4

Buccia , 9 byte

Γö→▼Mo₀↓ŀ

Restituisce Infquando non esiste alcuna soluzione. Provalo online!

Spiegazione

I valori di ritorno predefiniti di Husk sono utili qui.

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

Se l'elenco di input è vuoto, Γnon è possibile decostruirlo, quindi restituisce il valore intero predefinito, 0. Se il primo elemento è 0, il risultato di Mo₀↓ŀè un elenco vuoto, in cui restituisce infinito.


6

Haskell , 70 58 byte

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

Provalo online!

EDIT: -12 byte grazie a @Esolanging Fruit e all'OP per aver deciso di consentire l'infinito!

Restituisce Infinityquando non esiste una soluzione che la rende molto più semplice. Dal momento che possiamo solo andare avanti, fguarda in testa alla lista e lascia cadere gli 1<=k<=xelementi dalla lista e ricorre. Quindi aggiungiamo solo 1 a ciascuna soluzione trovata per le chiamate ricorsive e prendiamo il minimo. Se la testa è 0 il risultato sarà infinito (poiché non possiamo muoverci non c'è soluzione). Poiché 1+Infinity==Infinityquesto risultato verrà riportato ai chiamanti. Se l'elenco è vuoto significa che abbiamo lasciato l'array, quindi restituiamo un costo pari a 0.


1
58 byte , ma solo se si accetta Infinitycome valore null (cosa che l'OP non ha ancora chiarito).
Esolanging Fruit,

In realtà, OP ora lo ha permesso, quindi dovrebbe essere valido.
Esolanging Fruit,

3

Python 2 , 124 byte

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

Provalo online!

-11 byte grazie a Mr. Xcoder
-12 byte grazie a Mr. Xcoder e Rod


Hai fallito. print(f([4,1,0,4,1,1,1]))Ritorna 3, ma dovrebbe essere 2Like[0] -> [3] -> outside
0x45,

@ 0x45 in che modo ... aspetta, quando salti, devi saltare il più lontano possibile o dovunque nel mezzo?
HyperNeutrino,

@ Mr.Xcoder oh sì, duh. anche grazie per il -~trucco, dimenticato di quello.
HyperNeutrino,

@HyperNeutrino "Un salto dall'indice i è definito come un aumento dell'indice di array al massimo di un [i]."
Martin Ender,

1
@ 0x45 ok, grazie per il chiarimento. Penso di averlo corretto
HyperNeutrino il

3

APL (Dyalog Classic) ngn / apl , 18 byte

EDIT: passato alla mia implementazione di APL perché Dyalog non supporta gli infiniti e l'autore della sfida non consente ai numeri finiti di agire come "null"

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

Provalo online! provalo nella pagina demo di ngn / apl

ritorna per nessuna soluzione⌊/⍬


Qual è l '"argomento giusto" di ??
Erik the Outgolfer,

Questa sfida ha un disperato bisogno di migliori casi di test. Ma la tua soluzione non è valida, ad esempio, 2 3 1 1dovrebbe essere mappata2
H.Pwiz,

@EriktheOutgolfer 0Nche è null intero di k; se sei interessato, posso spiegare ulteriormente nella stanza apl
apl

@ H.PWiz ora può occuparsene
ngn

3

Haskell , 45 byte

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

Provalo online!

Emette Infinityquando impossibile. L'argomento ausiliario di sinistra per %tracciare quanti più spazi possiamo spostare nel nostro attuale hop.


2

Perl 5 , 56 53 byte

Include +1pera

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

Solo il codice:

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

Provalo online!




1

Gelatina , 19 18 byte

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

Provalo online!

Spiegazione

<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

1

JavaScript ES6 , 118 byte

(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])}}

Provalo online!

Esegue una prima ricerca della gamma per trovare il percorso più breve.



0

Julia 0.6 , 79 byte

Restituisce il numero di salti o Infse non puoi scappare. Guarda ricorsivamente il primo elemento e ritorna Info 1dipende da se riesci a scappare, altrimenti aggiungi 1alla soluzione più breve per le matrici troncate che rappresentano ciascun salto valido. Il flusso di controllo è fatto con due dichiarazioni ternarie come 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)

Provalo online!


0

C # (.NET Core) , 97 byte

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

Provalo online!

Restituisce 0 se non è stato trovato alcun percorso.

Spiegazione

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.