Kule atlamalı yapıyoruz


17

Görev

Negatif olmayan bir tamsayı dizisi verildiğinde, dizinin a"dışına" atlamak, 0 konumundan başlayarak veya mümkün değilse sıfır / null döndürmek için gereken minimum sağa atlama sayısını belirleyin.

Dizinden atlama , idizi dizininde en fazla artış olarak tanımlanır a[i].

Bir sıçrama dış atlama kaynaklanan göstergesi bir atlama iyani 1 tabanlı bir dizin için, dışı sınırları dizisi için i>length(a), ve 0 tabanlı dizin için i>=length(a).

örnek 1

Şunları düşünün 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

Sınırların dışına çıkmak için "zıplayarak" en kısa yolun uzunluğu vardır 2:

Biz atlama olabilir 0->2->4->outsidehangi uzunluğa sahiptir 3fakat 0->4->outsideuzunluğa sahiptir 2dönmek böylece 2.

ÖRNEK 2

Varsayalım 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

Bu durumda, dizinin dışına atlamak imkansızdır, bu nedenle sıfır / null veya herhangi bir deterministik olmayan değer döndürmeliyiz .

ÖRNEK 3

Varsayalım Array=[4]:

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

Dizinin dışından 0 dizininden doğrudan tek bir atlama ile atlayabiliriz, bu yüzden geri döneriz 1 .

Düzenle:

Dönüş değeri hakkında birden fazla soru nedeniyle: İade Kaçış şansı yoksa tamamen geçerlidir. Çünkü bir şans varsa, o sayıyı tanımlayabiliriz.

Bu , bu yüzden bayt içindeki en kısa kod kazanır!


9
Ayrıca, zorluklarınız için lütfen korumalı alanı kullanmayı düşünün ! Oraya posta göndermiş olsaydınız bu endişelerin birçoğu daha önce ele alınmış olabilir.
Giuseppe


3
@ 0x45 Ne varsayımı? Sizi ilgili bazı zorluklarla ilişkilendirdiğim gerçeği? Asla yinelenmedim . Ne demek istediğinizi tam olarak anlamadım.
Bay Xcoder

10
@ 0x45 lütfen iyi niyetleri varsayalım . Biz bu soruları soruyorsunuz değil biz meydan alay için çalışıyoruz çünkü. Aslında, tam tersi: biz meydan okumaya ilgi duyuyoruz. Sadece bir düşünün, meydan okumayı beğenmediysek neden açıklayıcı sorular sormalıyız? Bu amaçla iniş çıkışlarımız / yakın oylarımız var. (Ve gördüğüm gibi, kimse yayınınızı indirmedi!)
JungHwan Min

13
Her adımda maksimum mesafeyi hırsla atlamanın optimal olmadığı bir test vakasına sahip olmak iyi olurdu. Örneğin [2, 3, 1, 1].
Martin Ender

Yanıtlar:


4

Kabuk , 9 bayt

Γö→▼Mo₀↓ŀ

InfÇözüm olmadığında geri döner. Çevrimiçi deneyin!

açıklama

Husk'un varsayılan dönüş değerleri burada işe yarar.

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

Giriş listesi boşsa, Γyapıyı yapılandıramaz, bu nedenle varsayılan tamsayı 0 değerini döndürür. İlk öğe 0 ise, bunun sonucu, sonsuzluğu döndüren Mo₀↓ŀboş bir listedir .


6

Haskell , 70 58 bayt

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

Çevrimiçi deneyin!

DÜZENLEME: @Esolanging Fruit ve sonsuzluğa izin vermeye karar verdikleri OP sayesinde -12 bayt!

InfinityÇözümü çok daha basit hale getiren bir çözüm olmadığında geri döner. Sadece ileriye doğru hareket edebildiğimiz için fsadece listenin başına bakar ve 1<=k<=xöğeleri listeden bırakır ve tekrarlar. Daha sonra, her bir çözüme, özyinelemeli çağrıları bulduğumuz 1'i ekliyoruz ve minimumunu alıyoruz. Kafa 0 ise sonuç sonsuz olacaktır (hareket edemediğimiz için çözüm yoktur). Yana 1+Infinity==Infinitybu sonuç arayanlar geri taşınacaktır. Liste boşsa, diziden ayrıldığımız anlamına gelir, bu nedenle 0 maliyeti döndürürüz.


1
58 bayt , ancak yalnızca Infinitynull değer olarak izin verirseniz (OP'nin henüz netleştirmediği).
Esolanging Fruit

Aslında OP şimdi buna izin verdi, bu yüzden geçerli olmalı.
Esolanging Fruit

3

Python 2 , 124 bayt

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

Çevrimiçi deneyin!

Bay Xcoder sayesinde -11 bayt
Bay Xcoder ve Rod sayesinde -12 bayt


Sen başarısız print(f([4,1,0,4,1,1,1]))Sen dönmek 3fakat olmalıdır 2Beğen[0] -> [3] -> outside
0x45

@ 0x45 nasıl yani ... bekle, zıplarken, olabildiğince uzağa mı zıplayabilir misin?
HyperNeutrino

@ Mr.Xcoder oh evet, duh. ayrıca -~hile için teşekkürler , bunu unuttum.
HyperNeutrino

@HyperNeutrino "i dizininden bir sıçrama, dizi dizininde en fazla [i] bir artış olarak tanımlanır ."
Martin Ender

1
@ 0x45 tamam, açıkladığın için teşekkürler. Sanırım düzelttim
HyperNeutrino

3

APL (Dyalog Classic) ngn / apl , 18 bayt

DÜZENLEME: Dyalog sonsuzlukları desteklemediğinden ve meydan okuma yazarı sonlu sayıların "boş" olarak davranmasına izin vermediği için kendi APL uygulamama geçtim

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

Çevrimiçi deneyin! ngn / apl demo sayfasında deneyin

çözüm için geri dönüş yok⌊/⍬


"Doğru argüman" ?nedir?
Outgolfer Erik

Bu zorluk, daha iyi test senaryoları için umutsuz bir ihtiyaçtır. Ama çözüm örneğin geçersiz 2 3 1 1aktarılması gerektiğini2
H.PWiz

K'nin tamsayısı 0Nolan @EriktheOutgolfer null; eğer ilgileniyorsanız, apl odasında daha fazla açıklayabilirim
ngn

@ H.PWiz şimdi bununla başa çıkabilir
ngn

3

Haskell , 45 bayt

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

Çevrimiçi deneyin!

Infinityİmkansız olduğunda çıktılar . %Mevcut atlamada kaç boşluk daha hareket edebileceğimizi izleyen yardımcı sol argüman .


2

Perl 5 , 56 53 bayt

içerir +1içina

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

Sadece kod:

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

Çevrimiçi deneyin!




1

Jöle , 19 18 bayt

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

Çevrimiçi deneyin!

açıklama

<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



0

Julia 0.6 , 79 bayt

Atlama sayısını veya Infkaçamıyorsanız döndürür . İlk öğeye tekrar tekrar bakın ve geri dönün Infya 1da kaçabileceğinize bağlı olarak, aksi takdirde 1her geçerli atlamayı temsil eden kesik diziler için en kısa çözüme ekleyin . Kontrol akışı iki üçlü ifadeyle yapılır 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)

Çevrimiçi deneyin!


0

C # (.NET Core) , 97 bayt

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

Çevrimiçi deneyin!

Hiçbir yol bulunmazsa 0 değerini döndürür.

açıklama

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.