เรากระโดดหอคอย


17

งาน

กำหนดอาเรย์ของจำนวนเต็มแบบไม่ลบaกำหนดจำนวนต่ำสุดของการกระโดดทางขวาที่จำเป็นในการข้าม "นอก" อาเรย์เริ่มต้นที่ตำแหน่ง 0 หรือคืนค่าศูนย์ / โมฆะถ้าไม่สามารถทำได้

กระโดดจากดัชนีถูกกำหนดให้เป็นการเพิ่มขึ้นของดัชนีอาร์เรย์โดยที่มากที่สุดia[i]

กระโดดนอกเป็นกระโดดที่ดัชนีที่เกิดจากการกระโดดที่iจะออกนอกสนามสำหรับอาร์เรย์เพื่อให้การจัดทำดัชนี 1-based i>length(a)และสำหรับการจัดทำดัชนี i>=length(a)0-based

ตัวอย่างที่ 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มีความยาวเพื่อให้เรากลับมา22

ตัวอย่างที่ 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

ในกรณีนี้มันเป็นไปไม่ได้ที่จะข้ามไปนอกอาร์เรย์ดังนั้นเราควรจะกลับเป็นศูนย์ / null หรือค่ากำหนดใด ๆ ที่ไม่ใช่เช่น

ตัวอย่างที่ 3

สมมติว่าArray=[4]:

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

เราโดยตรงสามารถกระโดดจากดัชนี 0 1นอกอาร์เรย์ที่มีเพียงหนึ่งกระโดดเพื่อให้เรากลับมา

แก้ไข:

เนื่องจากคำถามหลายข้อเกี่ยวกับค่าส่งคืน: การส่งคืนถูกต้องทั้งหมดหากไม่มีโอกาสหลบหนี เพราะหากมีโอกาสเราสามารถกำหนดหมายเลขนั้นได้

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!


9
นอกจากนี้โปรดพิจารณาใช้กล่องทรายสำหรับความท้าทายของคุณ! ข้อกังวลเหล่านี้จำนวนมากอาจได้รับการแก้ไขก่อนหน้านี้หากคุณโพสต์ที่นั่น
Giuseppe

3
ที่เกี่ยวข้อง , ที่เกี่ยวข้อง
Mr. Xcoder

3
@ 0x45 อะไรคือสมมติฐาน? ความจริงที่ว่าฉันเชื่อมโยงคุณกับความท้าทายที่เกี่ยวข้อง? ฉันไม่เคยกล่าวซ้ำ ฉันไม่แน่ใจว่าคุณหมายถึงอะไร
Mr. Xcoder

10
@ 0x45 โปรดถือว่าความตั้งใจที่ดี เรากำลังถามคำถามเหล่านี้ไม่ใช่เพราะเราพยายามทำให้ความท้าทายของคุณเป็นจริง จริงๆแล้วมันค่อนข้างตรงกันข้าม: เราสนใจความท้าทายของคุณ แค่คิดดูทำไมเราจะถามคำถามที่ชัดเจนหากเราไม่ชอบความท้าทายของคุณ เรามีคะแนนโหวต / ปิดเพื่อจุดประสงค์นี้ (และอย่างที่ฉันเห็นไม่มีใครโพสต์โพสต์ของคุณลงเลย!)
JungHwan Min

13
มันจะเป็นการดีถ้ามีกรณีทดสอบที่การโลดโผนระยะทางสูงสุดในทุก ๆ ขั้นตอนนั้นไม่เหมาะสม [2, 3, 1, 1]เช่น
Martin Ender

คำตอบ:


4

Husk , 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 หากองค์ประกอบแรกเป็น 0 ผลลัพธ์ของรายการMo₀↓ŀนั้นจะเป็นรายการว่างซึ่งจะส่งกลับค่าอนันต์


6

Haskell , 70 58 ไบต์

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

ลองออนไลน์!

แก้ไข: -12 ไบต์ขอบคุณ @Esolanging Fruit และ OP สำหรับการตัดสินใจอนุญาตอนันต์!

ส่งคืน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

ลองออนไลน์!

-11 ไบต์ขอบคุณ Mr. Xcoder
-12 ไบต์ขอบคุณ Mr. Xcoder และ Rod


คุณล้มเหลวprint(f([4,1,0,4,1,1,1]))คุณกลับมา3แต่ควรเป็น2เหมือน[0] -> [3] -> outside
0x45

@ 0x45 เป็นอย่างไร ... รอเมื่อคุณกระโดดคุณจะต้องกระโดดให้ไกลที่สุดหรือที่ไหนก็ได้ระหว่างนั้น
HyperNeutrino

@ Mr.Xcoder โอ้ใช่แล้ว ขอบคุณสำหรับ-~เคล็ดลับลืมเรื่องนั้นด้วย
HyperNeutrino

@HyperNeutrino "การกระโดดจากดัชนี i ถูกกำหนดให้เป็นการเพิ่มขึ้นของดัชนีอาร์เรย์โดยมากที่สุด [i]"
Martin Ender

1
@ 0x45 ตกลงขอบคุณสำหรับการชี้แจง ฉันคิดว่าฉันซ่อมมันแล้ว
HyperNeutrino

3

APL (Dyalog Classic) ngn / apl , 18 ไบต์

แก้ไข: เปลี่ยนเป็นการใช้งาน APL ของฉันเองเนื่องจาก Dyalog ไม่สนับสนุนอินฟินิตี้และผู้เขียนความท้าทายไม่อนุญาตให้มีจำนวน จำกัด เพื่อทำหน้าที่เป็น "โมฆะ"

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

ลองออนไลน์! ลองใช้ที่หน้าตัวอย่างของ ngn / apl

ส่งคืนโดยไม่มีวิธีแก้ไข⌊/⍬


"การโต้แย้งที่ถูกต้อง" ?คืออะไร?
Erik the Outgolfer

ความท้าทายนี้ต้องการการทดสอบที่ดีกว่าหมดหวัง แต่โซลูชันของคุณไม่ถูกต้องตัวอย่างเช่น2 3 1 1ควรแมปกับ2
H.PWiz

@EriktheOutgolfer 0Nซึ่งเป็นจำนวนเต็ม k ของศูนย์ หากคุณสนใจฉันสามารถอธิบายเพิ่มเติมได้ในห้อง
apl

@ H.PWiz ตอนนี้มันสามารถจัดการกับที่
ngn

3

Haskell , 45 ไบต์

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

ลองออนไลน์!

เอาต์พุตInfinityเมื่อไม่สามารถทำได้ อาร์กิวเมนต์เสริมทางซ้ายเพื่อ%ติดตามจำนวนช่องว่างที่มากขึ้นที่เราสามารถเคลื่อนย้ายใน hop ปัจจุบันของเรา





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

1

JavaScript ES6 , 118 ไบต์

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

ลองออนไลน์!

ดำเนินการค้นหาอย่างกว้างแรกของอาร์เรย์เพื่อค้นหาเส้นทางที่สั้นที่สุด



0

Julia 0.6 , 79 bytes

ส่งคืนจำนวนการข้ามหรือInfถ้าคุณไม่สามารถหลบหนีได้ ดูองค์ประกอบแรกซ้ำ ๆ และส่งคืนInfหรือ1ขึ้นอยู่กับว่าคุณสามารถหลบหนีได้หรือเพิ่ม1วิธีแก้ปัญหาที่สั้นที่สุดสำหรับอาร์เรย์ที่ถูกตัดทอนแทนการกระโดดที่ถูกต้องแต่ละครั้ง โฟลว์การควบคุมเสร็จสิ้นด้วยสองประโยคประกอบ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.
    }

0

Python 2 , 83 73 72 ไบต์

-10 ขอบคุณ @ @ user202729
-1 ขอบคุณ@JonathanFrech

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

ลองออนไลน์! ส่งคืนค่าอนันต์สำหรับค่า Null


and min(...)+1forand-~min(...)forสามารถ
Jonathan Frech

@JonathanFrech แก้ไขแล้ว
ผลไม้ที่แยก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.