タワーホッピングをします


17

仕事

負でない整数aの配列を指定すると、位置0から開始して配列の「外側」にジャンプするために必要な右方向ジャンプの最小数を決定します。そうしない場合はゼロ/ nullを返します。

インデックスからのジャンプiは、配列インデックスの最大増加分であると定義されていますa[i]

外部へジャンプは、ジャンプの結果のインデックスiが配列の範囲であるジャンプです。そのため、1ベースのインデックス付けi>length(a)では、0ベースのインデックス付けでは、i>=length(a)

例1

考慮してください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

範囲外に移動する「ジャンプ」による最短経路の長さは2次のとおりです。

私たちは、からジャンプすることができ0->2->4->outside長さを有している3が、0->4->outside長さを持って2、我々は返すよう2

例2

仮定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

この場合、配列の外にジャンプすることは不可能なので、ゼロ/ヌルまたはのような非決定論的な値を返す必要があります

例3

仮定Array=[4]

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

1回のジャンプで、配列の外側のインデックス0から直接ジャンプできるため、を返し1ます。

編集:

戻り値に関する複数の質問のため:エスケープする機会がない場合、戻り値は完全に有効です。機会があれば、その数を定義できるからです。

これはなので、バイト単位の最短コードが勝ちです!


9
また、チャレンジにはサンドボックスの使用を検討しください!これらの懸念の多くは、あなたがそこに投稿した場合、以前に対処された可能性があります。
ジュゼッペ


3
@ 0x45どんな仮定?いくつかの関連する課題にあなたを結び付けたという事実は?重複とは決して言いませんでした。どういう意味かわかりません。
氏Xcoder

10
@ 0x45善意を想定してください。これらの質問をしているのは、あなたの挑戦をからかっているからではありません。実際、それは正反対です。私たちはあなたの挑戦に興味を持っています。考えてみてください。あなたの挑戦が嫌いだったら、なぜ明確な質問をするのでしょうか?その目的のために、私たちは下票/投票権を持っています。(そして、私が見るように、誰もあなたの投稿をダウン票していません!)
ジョンファンミン

13
すべてのステップで貪欲に最大距離をジャンプするのが最適ではないテストケースがあるとよいでしょう。たとえば[2, 3, 1, 1]
マーティンエンダー

回答:


4

、9バイト

Γö→▼Mo₀↓ŀ

Infソリューションが存在しない場合に戻ります。 オンラインでお試しください!

説明

Huskのデフォルトの戻り値はここで役立ちます。

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

入力リストが空の場合、Γ分解できないため、デフォルトの整数値0 Mo₀↓ŀ返されます。最初の要素が0の場合、結果は空のリストになり、無限リストが返されます。


6

Haskell70 58バイト

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

オンラインでお試しください!

編集:@Esolanging Fruitと無限大を許可することを決定したOPのおかげで-12バイト!

Infinityソリューションが非常に単純になるソリューションがない場合に戻ります。前方にしか移動できないためf、リストの先頭を見て、リスト1<=k<=xからアイテムをドロップして繰り返します。次に、再帰呼び出しが検出した各ソリューションに1を追加し、最小値を取得します。頭が0の場合、結果は無限になります(移動できないため、解決策はありません)。以来1+Infinity==Infinity、この結果は、発信者に戻って運ばれます。リストが空の場合は、配列を残しているため、コスト0を返します。


1
58バイト。ただしInfinity、null値として許可する場合のみ(OPはまだ明確にしていません)。
エソランジングフルーツ

実際、OPはこれを許可しているため、これは有効なはずです。
エソランジングフルーツ

3

Python 2、124バイト

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

オンラインでお試しください!

Mr. Xcoderのおかげで-11バイト
Mr. XcoderとRodのおかげで-12バイト


あなたは失敗したprint(f([4,1,0,4,1,1,1]))あなたは返す3が、あるべき2のように[0] -> [3] -> outside
0x45

@ 0x45どうして...待って、ジャンプするとき、できるだけ遠くまでジャンプする必要がありますか?
ハイパーニュートリノ

@ Mr.Xcoderあ、そうだね。また、-~トリックのおかげで、そのことを忘れていました。
ハイパーニュートリノ

@HyperNeutrino「インデックスiからのジャンプは、配列インデックスの最大 a [i]の増加と定義されます。」
マーティンエンダー

1
@ 0x45 OK、わかりやすくしてくれてありがとう。私はそれを固定考える
HyperNeutrino

3

APL(Dyalog Classic) ngn / apl、18バイト

編集:Dyalogは無限をサポートしておらず、チャレンジ作成者有限数を「null」として動作させることができないため、APLの独自の実装に切り替えました

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

オンラインでお試しください! ngn / aplのデモページで試してください

解決策なしに戻る⌊/⍬


の「正しい議論」とは?何ですか?
エリックアウトゴルファー

この課題は、より良いテストケースを切望しています。しかし、ソリューションは無効です。たとえば、2 3 1 12
H.PWizに

0Nkの整数nullである@EriktheOutgolfer 。もし興味があれば、私はapl部屋でさらに説明することができます
ngn

@ H.PWizで対処できるようになりました
-ngn





1

ゼリー19 18バイト

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

オンラインでお試しください!

説明

<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

ジュリア0.6、79バイト

ジャンプ数またはInfエスケープできない場合に返します。最初の要素を再帰的に見て、戻るInf1、エスケープできるかどうかに応じて、そうでない場合は1、各有効なジャンプを表す切り捨てられた配列の最短解に追加します。制御フローは、などの2つの三項ステートメントで行われ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)

オンラインでお試しください!


0

C#(.NET Core)、97バイト

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

オンラインでお試しください!

パスが見つからなかった場合は0を返します。

説明

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.