Kami melakukan tower hopping


17

Tugas

Diberikan array bilangan bulat non-negatif a, tentukan jumlah minimum lompatan ke kanan yang diperlukan untuk melompat "di luar" larik, mulai dari posisi 0, atau kembalikan nol / nol jika tidak memungkinkan untuk melakukannya.

Sebuah lompatan dari indeks ididefinisikan sebagai peningkatan indeks array oleh paling a[i].

Sebuah luar melompat adalah lompatan di mana indeks yang dihasilkan dari melompat ikeluar-of-batas untuk array, sehingga untuk mengindeks berbasis 1 i>length(a), dan untuk mengindeks 0 berbasis, i>=length(a).

Contoh 1

Pertimbangkan 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

Jalur terpendek dengan "melompat" untuk keluar batas memiliki panjang 2:

Kita bisa melompat dari 0->2->4->outsideyang memiliki panjang 3tetapi 0->4->outsidememiliki panjang 2sehingga kita kembali 2.

Contoh 2

Misalkan 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

Dalam kasus ini, tidak mungkin untuk melompat keluar dari array, jadi kita harus mengembalikan nilai nol / null atau non deterministik seperti apa .

Contoh 3

Misalkan Array=[4]:

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

Kami dapat langsung melompat dari indeks 0 di luar array, hanya dengan satu lompatan, jadi kami kembali 1.

Edit:

Karena beberapa pertanyaan tentang nilai pengembalian: Pengembalian benar-benar valid, jika tidak ada kesempatan untuk melarikan diri. Karena, jika ada kesempatan, kita bisa mendefinisikan angka itu.

Ini adalah , jadi kode terpendek dalam byte menang!


9
Juga, pertimbangkan menggunakan kotak pasir untuk tantangan Anda! Banyak dari masalah ini mungkin telah diatasi sebelumnya jika Anda memposting di sana.
Giuseppe


3
@ 0x45 Asumsi apa? Fakta bahwa saya menghubungkan Anda dengan beberapa tantangan terkait? Saya tidak pernah mengatakan duplikat . Saya tidak yakin apa yang Anda maksud.
Tn. Xcoder

10
@ 0x45 anggaplah niat baik . Kami mengajukan pertanyaan ini bukan karena kami berusaha mengolok-olok tantangan Anda. Sebenarnya, justru sebaliknya: kami tertarik dengan tantangan Anda. Coba pikirkan, mengapa kami akan mengajukan pertanyaan klarifikasi jika kami tidak menyukai tantangan Anda? Kami memiliki suara turun / suara dekat untuk tujuan itu. (Dan seperti yang saya lihat, tidak ada yang menurunkan pos Anda!)
JungHwan Min

13
Akan lebih baik untuk memiliki test case di mana dengan rakus melompat jarak maksimum pada setiap langkah tidak optimal. Sebagai contoh [2, 3, 1, 1].
Martin Ender

Jawaban:


4

Sekam , 9 byte

Γö→▼Mo₀↓ŀ

Kembali Infketika tidak ada solusi. Cobalah online!

Penjelasan

Nilai pengembalian default Hus sangat berguna di sini.

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

Jika daftar input kosong, maka Γtidak dapat mendekonstruksi, sehingga mengembalikan nilai integer default, 0. Jika elemen pertama adalah 0, maka hasilnya Mo₀↓ŀadalah daftar kosong, yang mengembalikan infinity.


6

Haskell , 70 58 byte

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

Cobalah online!

EDIT: -12 byte terima kasih kepada @Esolanging Fruit dan OP yang telah memutuskan untuk memungkinkan tak terbatas!

Kembali Infinityketika tidak ada solusi yang membuat solusi jauh lebih sederhana. Karena kita hanya bisa bergerak maju, lihat fsaja kepala daftar dan jatuhkan 1<=k<=xitem dari daftar dan berulang. Kemudian kami hanya menambahkan 1 untuk setiap solusi panggilan rekursif yang ditemukan dan mengambil minimum. Jika head adalah 0, hasilnya akan menjadi tak terbatas (karena kita tidak bisa bergerak tidak ada solusi). Karena 1+Infinity==Infinityhasil ini akan dibawa kembali ke penelepon. Jika daftar kosong itu berarti kami telah meninggalkan array sehingga kami mengembalikan biaya 0.


1
58 byte , tetapi hanya jika Anda mengizinkan Infinitysebagai nilai nol (yang belum diklarifikasi oleh OP).
Buah Esolanging

Sebenarnya, OP sekarang telah mengizinkan ini, jadi itu harus valid.
Buah Esolanging

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

Cobalah online!

-11 byte terima kasih kepada Tn. Xcoder
-12 byte terima kasih kepada Tn. Xcoder dan Rod


Anda gagal print(f([4,1,0,4,1,1,1]))Anda kembali 3, tetapi harus 2Suka[0] -> [3] -> outside
0x45

@ 0x45 bagaimana ... tunggu, ketika Anda melompat, apakah Anda harus melompat sejauh mungkin atau di mana saja di antara keduanya?
HyperNeutrino

@ Mr.Xcoder oh yeah, ya. juga terima kasih atas -~triknya, lupakan yang itu.
HyperNeutrino

@HyperNeutrino "Lompatan dari indeks i didefinisikan sebagai peningkatan dalam indeks array paling banyak [i]."
Martin Ender

1
@ 0x45 ok, terima kasih sudah menjelaskan. Saya rasa saya memperbaikinya
HyperNeutrino

3

APL (Dyalog Classic) ngn / apl , 18 byte

EDIT: beralih ke penerapan APL saya sendiri karena Dyalog tidak mendukung ketidakterbatasan dan pembuat tantangan tidak mengizinkan angka terbatas untuk bertindak sebagai "nol"

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

Cobalah online! coba di halaman demo ngn / apl

kembali tanpa solusi⌊/⍬


Apa "argumen yang tepat" dari ??
Erik the Outgolfer

Tantangan ini sangat membutuhkan uji kasus yang lebih baik. Tetapi solusi Anda tidak valid misalnya 2 3 1 1harus dipetakan ke2
H.PWiz

@EriktheOutgolfer 0Nyang merupakan bilangan bulat k's; jika Anda tertarik, saya dapat menjelaskan lebih lanjut di ruang apl
ngn

@ H.PWiz sekarang dapat mengatasinya
ngn

3

Haskell , 45 byte

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

Cobalah online!

Output Infinityketika tidak mungkin. Argumen bantu tambahan untuk %melacak berapa banyak ruang yang dapat kita pindahkan dalam hop kita saat ini.


2

Perl 5 , 56 53 byte

Termasuk +1untuka

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

Hanya kode:

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

Cobalah online!




1

Jelly , 19 18 byte

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

Cobalah online!

Penjelasan

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

Cobalah online!

Melakukan pencarian luas pertama array untuk menemukan jalur terpendek.



0

Julia 0,6 , 79 byte

Mengembalikan jumlah lompatan atau Infjika Anda tidak dapat melarikan diri. Secara rekursif lihat elemen pertama dan kembali Infatau 1tergantung pada apakah Anda dapat melarikan diri, jika tidak tambahkan 1ke solusi terpendek untuk array terpotong yang mewakili setiap lompatan yang valid. Aliran kontrol dilakukan dengan dua pernyataan ternary seperti 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)

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

Cobalah online!

Mengembalikan 0 jika tidak ada jalur yang ditemukan.

Penjelasan

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.