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.