Fazemos salto de torre

17

Tarefa

Dada uma matriz de números inteiros não negativos a, determine o número mínimo de saltos para a direita necessários para pular "fora" da matriz, iniciando na posição 0, ou retornar zero / nulo se não for possível.

Um salto do índice ié definido como um aumento no índice da matriz, no máximo a[i].

Um salto para fora é um salto em que o índice resultante do salto iestá fora dos limites da matriz, portanto, para indexação com base em 1 i>length(a)e para indexação com base em 0 i>=length(a),.

Exemplo 1

Considere 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

O caminho mais curto "pulando" para sair dos limites tem comprimento 2:

Nós poderíamos pular de 0->2->4->outsidequal tem comprimento, 3mas 0->4->outsidetem comprimento, 2então voltamos 2.

Exemplo 2

Suponha 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

Nesse caso, é impossível pular fora da matriz, portanto, devemos retornar um valor zero / nulo ou qualquer valor não determinístico .

Exemplo 3

Suponha Array=[4]:

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

Podemos pular diretamente do índice 0 fora da matriz, com apenas um salto, por isso retornamos 1.

Editar:

Devido a várias perguntas sobre o valor de retorno: O retorno é totalmente válido, se não houver chance de escapar. Porque, se houver uma chance, podemos definir esse número.

Isso é , então o código mais curto em bytes vence!

0x45
fonte
9
Além disso, considere usar a sandbox para seus desafios! Muitas dessas preocupações podem ter sido abordadas anteriormente se você tivesse postado lá.
Giuseppe
3
Relacionado , Relacionado .
Sr. Xcoder
3
@ 0x45 Que suposição? O fato de eu ter vinculado você a alguns desafios relacionados? Eu nunca disse duplicado . Eu não estou certo do que você quer dizer.
Mr. Xcoder
10
@ 0x45, assuma boas intenções . Estamos fazendo essas perguntas não porque estamos tentando tirar sarro do seu desafio. Na verdade, é exatamente o contrário: estamos interessados ​​no seu desafio. Pense bem, por que faríamos perguntas esclarecedoras se não gostássemos do seu desafio? Temos os votos negativos / votos negativos para esse fim. (E, pelo que vejo, ninguém votou negativamente na sua postagem!) #
11157 JungHwan Min
13
Seria bom ter um caso de teste em que pular avidamente a distância máxima a cada passo não seja o ideal. Por exemplo [2, 3, 1, 1].
Martin Ender

Respostas:

4

Casca , 9 bytes

Γö→▼Mo₀↓ŀ

Retorna Infquando não existe solução. Experimente online!

Explicação

Os valores de retorno padrão do Husk são úteis aqui.

Γö→▼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 a lista de entrada estiver vazia, Γnão será possível desconstruí-la, retornando o valor inteiro padrão, 0. Se o primeiro elemento for 0, o resultado de Mo₀↓ŀserá uma lista vazia, na qual retornará infinito.

Zgarb
fonte
6

Haskell , 70 58 bytes

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

Experimente online!

EDIT: -12 bytes graças ao @Esolanging Fruit e ao OP por decidir permitir o infinito!

Retorna Infinityquando não há solução que torne a solução muito mais simples. Como só podemos avançar, fapenas olha para o cabeçalho da lista e elimina 1<=k<=xitens da lista e recorremos novamente. Em seguida, adicionamos 1 a cada solução das chamadas recursivas encontradas e reduzimos o mínimo. Se a cabeça for 0, o resultado será infinito (já que não podemos nos mover, não há solução). Uma vez que 1+Infinity==Infinityeste resultado será levado de volta para os chamadores. Se a lista estiver vazia, significa que deixamos a matriz e retornamos um custo de 0.

user1472751
fonte
1
58 bytes , mas apenas se você permitir Infinitycomo o valor nulo (que o OP ainda não esclareceu).
Esolanging Fruit
Na verdade, o OP agora permitiu isso, e isso deve ser válido.
Esolanging Fruit
3

Python 2 , 124 bytes

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

Experimente online!

-11 bytes graças ao Sr. Xcoder
-12 bytes graças ao Sr. Xcoder e Rod

HyperNeutrino
fonte
Você falhou print(f([4,1,0,4,1,1,1]))Você volta 3, mas deve ser 2Like[0] -> [3] -> outside
0x45 22/02
@ 0x45 como assim ... espere, quando você pula, você tem que pular o mais longe possível ou em qualquer outro lugar?
HyperNeutrino 22/02
@ Mr.Xcoder oh sim, duh. também obrigado pelo -~truque, esqueci disso.
HyperNeutrino 22/02
@HyperNeutrino "Um salto do índice i é definido como um aumento no índice da matriz em no máximo a [i]."
Martin Ender
1
@ 0x45 ok, obrigado por esclarecer. Eu acho que
consertei
3

APL (Dyalog Classic) ngn / apl , 18 bytes

EDIT: mudei para minha própria implementação do APL porque o Dyalog não suporta infinitos e o autor do desafio não permite que números finitos atuem como "nulos"

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

Experimente online! experimente na página de demonstração do ngn / apl

retorna para nenhuma solução⌊/⍬

ngn
fonte
Qual é o "argumento certo" de ??
Erik the Outgolfer
Esse desafio precisa desesperadamente de melhores casos de teste. Mas a sua solução é inválido, por exemplo, 2 3 1 1devem ser mapeados para2
H.PWiz
@EriktheOutgolfer, 0Nque é o número inteiro nulo de k; Se você estiver interessado, eu posso explicar melhor na sala de apl
NGN
@ H.PWiz agora ele pode lidar com isso
NGN
3

Haskell , 45 bytes

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

Experimente online!

Saídas Infinityquando impossíveis. O argumento auxiliar esquerdo para %rastrear quantos mais espaços podemos mover em nosso salto atual.

xnor
fonte
2

Perl 5 , 56 53 bytes

Inclui +1paraa

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

Apenas o código:

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

Experimente online!

Ton Hospel
fonte
1

Gelatina , 32 bytes

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

Experimente online!

Isso é muito longo ...

Erik, o Outgolfer
fonte
1

Geléia , 19 18 bytes

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

Experimente online!

Explicação

<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
milhas
fonte
1

JavaScript ES6 , 118 bytes

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

Experimente online!

Executa uma primeira pesquisa abrangente da matriz para encontrar o caminho mais curto.

fəˈnɛtɪk
fonte
0

Julia 0.6 , 79 bytes

Retorna o número de saltos ou Infse você não pode escapar. Observe recursivamente o primeiro elemento e retorne Infou, 1dependendo se você puder escapar, adicione 1a solução mais curta para matrizes truncadas que representam cada salto válido. O fluxo de controle é feito com duas declarações ternárias, como 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)

Experimente online!

gggg
fonte
0

C # (.NET Core) , 97 bytes

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

Experimente online!

Retorna 0 se nenhum caminho foi encontrado.

Explicação

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
fonte
0

Python 2 , 83 73 72 bytes

-10 graças a @ user202729
-1 graças a @JonathanFrech

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

Experimente online! Retorna o infinito para um valor nulo.

Esolanging Fruit
fonte
and min(...)+1forpode ser and-~min(...)for.
Jonathan Frech
@JonathanFrech Editado.
Esolanging Fruit