ข้ามเหมือนกระต่าย!


41

กำหนดรายการของจำนวนเต็มที่ไม่เป็นลบในรูปแบบที่เหมาะสมให้วนซ้ำข้ามองค์ประกอบมากเท่าจำนวนเต็มที่คุณพูด


นี่คือตัวอย่างการทำงาน:

[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | []
 ^ First element, always include it
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0]
    ^ Skip 0 elements
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0, 1]
          ^ Skip 1 element
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0, 1, 2]
                   ^ Skip 2 elements
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0, 1, 2, 3]
Skip 3 elements; you're done

ตัวอย่างการทำงานอื่นไม่เหมือนเดลตาทั้งหมด

[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | []
 ^ First element, always include it
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4]
                ^ Skip 4 elements
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4, 3]
                            ^ Skip 3 elements
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4, 3, 3]
                                        ^ Skip 3 elements
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4, 3, 3, 4]
Skip 4 elements; you're done

ตัวอย่างนอกขอบเขต:

[0, 2, 0, 2, 4, 1, 2] | []
^ First element, always include it
[0, 2, 0, 2, 4, 1, 2] | [0]
    ^ Skip 0 elements
[0, 2, 0, 2, 4, 1, 2] | [0, 2]
             ^ Skip 2 elements
[0, 2, 0, 2, 4, 1, 2] | [0, 2, 4]
Skip 4 elements; you're done (out of bounds)

กฎระเบียบ

  • คุณไม่สามารถใช้การโกงใด ๆ ที่น่าเบื่อในหมู่คนเหล่านี้ทำให้พวกเขาน่าเบื่อความท้าทายและไม่น่าทึ่ง
  • คุณควรส่งคืน / พิมพ์ผลสุดท้ายเท่านั้น เอาต์พุต STDERR ถูกละเว้น
  • คุณอาจไม่ได้รับอินพุตเป็นสตริงตัวเลขในฐานใด ๆ (เช่น "0102513162" สำหรับกรณีแรก)
  • คุณต้องใช้คำสั่งซื้อจากซ้ายไปขวาสำหรับการป้อนข้อมูล
  • เช่นเดียวกับในตัวอย่างที่ใช้งานได้หากคุณออกนอกขอบเขตการดำเนินการจะสิ้นสุดลงหากไม่เช่นนั้น
  • คุณควรใช้0สำหรับการข้ามองค์ประกอบ 0
  • ที่ได้รับรายการที่ว่างเปล่า ( []) เป็น input []คุณควรกลับ

กรณีทดสอบ

[]                                                     => []
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]                     => [0, 1, 3, 7]
[5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]                   => [5, 2, 1, 0]
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2]                         => [0, 1, 2, 3]
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] => [4, 3, 3, 4]
[0, 2, 0, 2, 4, 1, 2]                                  => [0, 2, 4]

นี่คือคำตอบที่สั้นที่สุดชนะ!


1
การมีเลขศูนย์ต่อท้ายอยู่ในอาร์เรย์ของฉันไหม จะช่วยฉัน ~ 18 ไบต์
Roman Gräf

@EriktheOutgolfer เราสามารถส่งออกอาร์เรย์สตริงและมีสตริงว่างต่อท้าย?
TheLethalCoder

1
@TheLethalCoder ขออภัยฉันจะบอกว่าไม่เพราะมันไม่เหมาะสม imo ... คุณไม่สามารถลบต่อท้าย""หรือไม่
Erik the Outgolfer

2
@ RomanGräfขออภัย แต่ไม่ว่าจะคลุมเครือเกินไปเนื่องจากมีบางกรณีที่คุณควรมีการติดตาม0ในผลลัพธ์
Erik the Outgolfer

คำตอบ:


14

Python 2 , 36 ไบต์

f=lambda x:x and x[:1]+f(x[x[0]+1:])

ลองออนไลน์!


ผมคาดหวังว่าจะได้รับการ outgolfed แต่ไม่ใช่ว่าไม่ดี :)
นาย Xcoder

คุณทำx[0]แทนx[:1]ไม่ได้ใช่ไหม
Erik the Outgolfer

@EriktheOutgolfer ใช่ แต่ต้องเป็นรายการดังนั้นมันจะเป็นเช่นนั้น[x[0]]
Rod

@Rod คุณไม่ได้ประหยัดไบต์ใด ๆ ที่มีx[:1]อยู่แล้ว ...f=lambda x:x and[x[0]]+f(x[x[0]+1:])
เอริก Outgolfer

13

Python 2 , 49 44 * 41 ไบต์

ข้ามออก 44 ยังคงเป็นปกติ 44 :(

* -3 ต้องขอบคุณ @

l=input()
while l:print l[0];l=l[l[0]+1:]

ลองออนไลน์!

พิมพ์ผลลัพธ์ที่คั่นด้วยบรรทัดใหม่ตามที่ OP อนุญาตในการแชท ผมไม่คิดว่ามันจะได้รับการใด ๆ สั้นเป็นโปรแกรมเต็มรูปแบบที่ไม่ใช่ recursive


มันทำงานอย่างไร

  • l=input() - อ่านรายการจากอินพุตมาตรฐาน

  • while l: - ละเมิดความจริงที่ว่ารายการว่างเปล่าเป็นเท็จใน Python วนซ้ำจนกว่ารายการนั้นจะว่างเปล่า

  • print l[0]; - พิมพ์องค์ประกอบแรกของรายการ

  • l=l[l[0]+1:]- "ข้ามเหมือนกระต่าย" - จดจ้องที่แรกl[0]+1จากรายการ

ลองยกตัวอย่าง

ได้รับรายการ[5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]เป็น input ดำเนินรหัสดังต่อไปนี้ (ตามคำอธิบายข้างต้น) - พิมพ์รายการแรกของอาร์เรย์: 5ตัดแรก [2, 1, 2, 1, 0, 0]6: จากนั้นเราพิมพ์2และตัดแต่ง 3: [1,0,0]แรก ในทำนองเดียวกันเราส่งออก1พืช 2 [0]ครั้งแรกและเราได้รับ แน่นอน0มีการพิมพ์และโปรแกรมจะสิ้นสุดลง




9

JavaScript (ES6), 42 39 35 ไบต์

a=>a.map((n,i)=>a.splice(i+1,n))&&a

let f = 
a=>a.map((n,i)=>a.splice(i+1,n))&&a

console.log(f([]))                                                     // => []
console.log(f([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))                     // => [0, 1, 3, 7]
console.log(f([5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]))                   // => [5, 2, 1, 0]
console.log(f([0, 1, 0, 2, 5, 1, 3, 1, 6, 2]))                         // => [0, 1, 2, 3]
console.log(f([4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2])) // => [4, 3, 3, 4]
console.log(f([0, 2, 0, 2, 4, 1, 2]))                                  // => [0, 2, 4]

โซลูชันเก่า 39 ไบต์

a=>a.map(n=>i--||r.push(i=n),r=i=[])&&r

-3 ไบต์ขอบคุณ @ThePirateBay


39 bytesa=>a.map(n=>i--||r.push(i=n),r=i=[])&&r


8

Mathematica, 46 44 ไบต์

SequenceCases[#,{x_,y___}/;Tr[1^{y}]<=x:>x]&

ทางเลือก:

SequenceCases[#,{x_,y___}/;x>=Length@!y:>x]&
SequenceCases[#,l:{x_,___}/;x>Tr[1^l]-2:>x]&

7

C #, 68 ไบต์

a=>{for(int i=0;i<a.Count;i+=a[i]+1)System.Console.Write(a[i]+" ");}

ลองออนไลน์!

เวอร์ชันเต็ม / ฟอร์แมต:

namespace System
{
    class P
    {
        static void Main()
        {
            Action<Collections.Generic.List<int>> f = a =>
            {
                for (int i = 0; i < a.Count; i += a[i] + 1)
                    System.Console.Write(a[i] + " ");
            };

            f(new Collections.Generic.List<int>() { });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 0, 1, 0, 2, 5, 1, 3, 1, 6, 2 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 0, 2, 0, 2, 4, 1, 2 });Console.WriteLine();

            Console.ReadLine();
        }
    }
}

การส่งคืนรายการมีความยาวมากกว่า 107 ไบต์

a=>{var l=new System.Collections.Generic.List<int>();for(int i=0;i<a.Count;i+=a[i]+1)l.Add(a[i]);return l;}

2
ทำไมบางคนลงคะแนนนี้
TheLethalCoder

ในการปัดเศษคะแนนของคุณและทำให้สมบูรณ์ 5k?
โทมัส Ayoub

@ThomasAyoub เราสามารถสันนิษฐานได้ว่ามันเป็นคนที่มี OCD ใช่
TheLethalCoder

6

Husk , 8 6 ไบต์

←TU¡Γ↓

ลองออนไลน์!

-2 ไบต์ (และแนวคิดการแก้ปัญหาใหม่ทั้งหมด) ขอบคุณ Leo!

คำอธิบาย

Γฉันใช้ฟังก์ชั่นรายการรูปแบบการแข่งขัน มันต้องใช้ฟังก์ชั่นfและรายการที่มีหัวxและหางxsและนำไปใช้fในการและx xsหากรายการว่างเปล่าΓส่งคืนค่าเริ่มต้นที่สอดคล้องกับประเภทในกรณีนี้รายการที่ว่างเปล่า เราใช้fจะเป็นซึ่งลดลงจากองค์ประกอบx xsฟังก์ชั่นนี้จะถูกทำซ้ำแล้วองค์ประกอบจะถูกรวบรวมในรายการ

←TU¡Γ↓  Implicit input, e.g. [0,2,0,2,4,1,2]
    Γ↓  Pattern match using drop
   ¡    iterated infinitely: [[0,2,0,2,4,1,2],[2,0,2,4,1,2],[4,1,2],[],[],[],...
  U     Cut at first repeated value: [[0,2,0,2,4,1,2],[2,0,2,4,1,2],[4,1,2],[]]
 T      Transpose: [[0,2,4],[2,0,1],[0,2,2],[2,4],[4,1],[1,2],[2]]
←       First element: [0,2,4]

คุณสามารถวางค่าเริ่มต้นของøและทุกอย่างจะยังคงทำงานได้อย่างน่าอัศจรรย์ :)
สิงห์

หรือสำหรับไบต์ที่น้อยลงtio.run/##yygtzv7//1HbhJDQQwvPTX7UNvn////RBjpGOiBsomOoYxQLAA
Leo

@Leo โอ้ว้าวนั่นเป็นคนฉลาด!
Zgarb

ทำไมคุณถึง CW
Erik the Outgolfer

@ErikTheOutgolfer นั่นเป็นข้อผิดพลาด (ฉันอยู่ในโทรศัพท์ของฉันและเห็นได้ชัดว่าผลักบางสิ่งบางอย่างโดยไม่ได้ตั้งใจ) ฉันพยายามยกเลิกการ ...
Zgarb


5

Pyth, 22 ไบต์

VQ aY.(Q0VeY .x.(Q0 ;Y

ลบ byte ที่ไร้ประโยชน์


ฉันเห็น 23 ไบต์ที่นั่น
Erik the Outgolfer

Typo :) ขอโทษ ...
เดฟ

3
ฉันไม่แน่ใจว่าทำไมคุณถึงลงคะแนน มีความเป็นไปได้ที่เมื่อคุณแก้ไขการแก้ไขคำตอบของคุณสิ่งนี้เรียก "ลงคะแนนเสียงอัตโนมัติ" สาเหตุของการลงคะแนนอัตโนมัตินี้ทำให้เกิดความสับสนและน่ากลัว แต่เกิดขึ้นหากระบบพิจารณาว่าคำตอบของคุณเป็น "คุณภาพต่ำ" ตามการวิเคราะห์พฤติกรรม อาจเป็นไปได้ว่ามีคนไม่ชอบคำตอบของคุณ แต่ฉันไม่เห็นอะไรผิดปกติกับมันในขณะนี้ดังนั้นฉันไม่แน่ใจว่าทำไมถึงเป็นเช่นนั้น
ตัวช่วยสร้างข้าวสาลี

ฉันดีใจที่คุณใช้ Pyth!
isaacg


3

เรติน่า 36 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

.+
$*
((1)*¶)(?<-2>1*¶)*
$1
%M`.
0$

อินพุตและเอาต์พุตถูกแยก linefeed ด้วยการลาก linefeed

ลองออนไลน์! (ใช้เครื่องหมายจุลภาคแทน linefeeds เพื่ออนุญาตให้ใช้ชุดทดสอบที่สะดวก)


3

Brain-Flak , 64 ไบต์

([]){{}(({})<>)<>{({}[()]<{}>)}{}([])}{}<>([]){{}({}<>)<>([])}<>

ลองออนไลน์!

([]){{}                          ([])}{}                         # Until the stack is empty
       (({})<>)<>                                                # Copy TOS to off stack
                 {({}[()]<{}>)}{}                                # Pop TOS times
                                        <>([]){{}({}<>)<>([])}<> # Reverse off stack

7
อึศักดิ์สิทธิ์! ผมเขียนถึงวิธีการแก้ปัญหาและจากนั้นเลื่อนลงไปที่โพสต์ได้ แต่มันกลับกลายเป็นเราเขียนที่แน่นอนการแก้ปัญหาเดียวกันไบต์สำหรับไบต์! แม้แต่รายละเอียดเล็กน้อยเช่น({}[()]<{}>)vs ({}<{}>[()])ก็เหมือนกัน! ช่างเป็นเรื่องบังเอิญ!
DJMcMayhem

@DJMcMayhem ขโมยชื่อเสียงทั้งหมด XD
Christopher

ฉันยังทำไบต์สำหรับไบต์แก้ปัญหาเหมือนกัน แต่ผมแข็งแรงเล่นกอล์ฟมันลง 4 ไบต์ การแข่งขันล่าช้าไปบ้าง :)
Wheat Wizard

2

Mathematica, 64 50 ไบต์

±x_List:=Prepend[±Drop[x,1+#&@@x],#&@@x]
±_=±{}={}

ฉันไม่สามารถต้านทานการเล่นกอล์ฟที่เป็นระเบียบนี้ได้อีก คำตอบของฉันอยู่ด้านล่าง
Mr.Wizard

2

C # (. NET Core) , 68 ไบต์

n=>{var t="";for(int i=0;i<n.Length;i+=n[i]+1)t+=n[i]+" ";return t;}

ลองออนไลน์!

รับอินพุตเป็นอาร์เรย์ของจำนวนเต็มส่งคืนสตริงที่มีค่าที่ไม่ถูกข้าม


เป็นวิธีที่ดีในการทำและเข้ามานับเช่นเดียวกับการพิมพ์
TheLethalCoder

ฉันรักทางออกที่ง่าย ยังคงต้องเรียนรู้ LINQ แต่ที่ผมได้เห็นว่าร่นจำนวนมากดังนั้น lambdas C # ..
jkelm

ย่อให้สั้นลงเนื่องจากคุณสามารถส่งคืนได้โดยปริยาย แม้ว่ามันจะเป็นการโยนระหว่างการส่งกลับโดยนัยกับusing System.Linq;ลูปปกติ
TheLethalCoder

2

R, 58 ไบต์

f=function(x,p=1){cat(z<-x[p]);if(p+z<sum(x|1))f(x,p+z+1)}

ฟังก์ชั่นวนซ้ำ ใช้เวลาเวกเตอร์xเป็นอาร์กิวเมนต์และ intiates pตัวชี้ สิ่งนี้จะพิมพ์รายการที่สอดคล้องกันของxตรวจสอบว่าp+x[p]จะเกินขอบเขตและถ้าไม่ได้เรียกใช้ฟังก์ชันสำหรับตัวชี้ใหม่

f=function(x,p=1,s=x[1])`if`((z<-x[p]+p+1)>sum(x|1),s,f(x,z,c(s,x[z])))

นี่เป็นวิธีแก้ปัญหาที่เทียบเคียงได้ซึ่งจะส่งคืนเวกเตอร์ที่เหมาะสมแทนที่จะพิมพ์ตัวเลข


สิ่งที่เกี่ยวกับการป้อนข้อมูลของnumeric(0)? อาคาอาร์เรย์ที่ว่างเปล่า
Giuseppe

@Giuseppe ฉันจะดูมันเมื่อฉันอยู่หลังพีซีของฉัน
JAD


2

Java (OpenJDK 8) , 53 ไบต์

ขอบคุณ @ PunPun1000 และ @TheLethalCoder

a->{for(int n=0;;n+=1+a[n])System.out.println(a[n]);}

ลองออนไลน์!


การพิมพ์ผลลัพธ์เช่นในคำตอบ C # ของฉันจะช่วยคุณประหยัดทุกอย่างหรือไม่
TheLethalCoder

@TheLethalCoder ป่วยลอง
Roman Gräf

คุณสามารถบันทึก byte โดยย้ายnเข้าไปในลูปได้หรือไม่?
TheLethalCoder

นอกจากนี้ดูเหมือนว่าจะไม่ทำงานในขณะนี้
TheLethalCoder

(a[n+=1+a[n]]คุณไม่มีวงเล็บหลังจากที่ ฟังก์ชั่นยังโยนข้อผิดพลาดหลังจากที่ส่งออกค่าที่ถูกต้องฉันไม่ทราบว่าฉันทามติว่าจะอนุญาตหรือไม่ หากนั่นคือเจตนาคุณสามารถลบเครื่องหมายวงn<a.lengthในสำหรับ ในที่สุดรหัส TIO จะไม่ทำงานตามที่เป็นอยู่แม้จะเป็นแบบ Paren ก็ตาม ฟังก์ชั่นควรเป็นConsumer<int[]>และใช้งานfunc.accept(test)
PunPun1000

2

อลิซ 15 ไบต์

/$.. \h&
\I@nO/

ลองออนไลน์!

อินพุตและเอาต์พุตรายการจำนวนเต็มทศนิยมที่คั่นด้วย linefeed

คำอธิบาย

/   Switch to Ordinal mode.
I   Read a line.
.   Duplicate it.
n   Logical NOT (gives truthy if we're at EOF).
/   Switch to Cardinal.
    The IP wraps around to the left.
\   Switch to Ordinal.
$@  Terminate the program if we're at EOF.
.   Duplicate the input line again.
O   Print it.
\   Switch to Cardinal.
h   Increment the value.
&   Store the result in the iterator queue.
    The program wraps around to the beginning.

การเก็บจำนวนเต็มnในคิวตัววนซ้ำทำให้คำสั่งถัดไปถูกเรียกใช้งานnครั้ง กระจกชอบไม่ได้คำสั่งเพื่อให้คำสั่งต่อไปจะเป็น/ Iดังนั้นหากเราเพิ่งอ่านและพิมพ์ค่าxเราจะอ่านค่าx + 1 ในการคำนวณซ้ำครั้งถัดไปโดยที่ค่าสุดท้ายจะสิ้นสุดที่ด้านบนสุดของสแต็ก สิ่งนี้จะข้ามองค์ประกอบรายการหมายเลขที่ต้องการ


2

Mathematica , 37 (30?)

การตีกอล์ฟต่อไปด้วยวิธีการที่ดีของผู้ใช้ 2,02729

±{a_,x___}={a}~Join~±{x}~Drop~a
±_={}

กฎดูเหมือนจะไม่ระบุรูปแบบผลลัพธ์อย่างชัดเจนดังนั้นอาจจะ:

±{a_,x___}=a.±{x}~Drop~a
±_={}

เอาต์พุตสำหรับฟังก์ชันที่สองมีลักษณะดังนี้: 0.2.4.{}- {}ยังคงส่งคืนสำหรับชุดที่ว่างเปล่าซึ่งเป็นไปตามกฎสุดท้าย


1
±Drop[{x},a]สามารถเป็น±{x}~Drop~aเพราะมีความสำคัญต่ำกว่า± Infix
JungHwan Min

@JungHwanMin ฉันพลาดไป ขอบคุณ!
Mr.Wizard


2

Brain-Flak , 64 60 ไบต์

4 ไบต์บันทึกตามแนวคิดจาก0 '

([]){{}(({})<>())<>{({}[()]<{}>)}{}([])}{}<>{({}[()]<>)<>}<>

ลองออนไลน์!

ข้อเขียน

([]){{}            #{Until the stack is empty}
  (({})<>())<>     #{Put n+1 to the offstack}
  {({}[()]<{}>)}{} #{Remove n items from the top}
([])}{}            #{End until}
<>                 #{Swap stacks}
{({}[()]<>)<>}<>   #{Move everything back onto the left stack decrementing by 1}

1

ทับทิม, 36 33 31

f=->l{a,*l=l;a&&f[l.drop(p a)]}

ลองออนไลน์


คุณได้รับอนุญาตให้ลบf=องค์ประกอบส่วนหัว
canhascodez

@sethrin แม้ว่าฉันจะต้องเรียกมันซ้ำ ๆ ?
Cristian Lupascu

อืมคำถามที่ดี ฉันไม่คิด ฉันทำเช่นนั้นมากเกี่ยวกับวิธีการแก้ปัญหาของคุณ
canhascodez

1

Python 2.4, 85 ไบต์

ไม่มีโอกาสที่จะชนะด้วยไพ ธ อน แต่ฉันรักผู้บุกรุกและสิ่งนี้อาจน่าสนใจสำหรับผู้อื่น
ปรากฎว่ามีเคล็ดลับมายากลแฟนซีในการเข้าถึงรายการสิ่งก่อสร้างภายในความเข้าใจ แต่ใช้งานได้เฉพาะใน 2.4 และมีการแก้ไขบางอย่างใน <= 2.3
locals()['_[1]']มันคือ งูหลามสร้างชื่อลับสำหรับรายการในขณะที่มันถูกสร้างขึ้นและเก็บไว้ใน_[1] localsนอกจากนี้ยังมีชื่อ_[2], _[3]... ถูกนำมาใช้สำหรับรายการที่ซ้อนกัน

lambda n:[j for i,j in enumerate(n)if i==len(locals()['_[1]'])+sum(locals()['_[1]'])]

ดังนั้นจึงนับจำนวนองค์ประกอบที่เพิ่มไปแล้วรวมกับผลรวมของพวกเขา ผลลัพธ์คือดัชนีขององค์ประกอบที่ต้องการต่อไป
ฉันคิดว่าควรมีวิธีหลีกเลี่ยงการแจกแจง [ n[len(locals()['_[1]'])+sum(locals()['_[1]'])] for ... ]เช่นเดียวกับการเข้าถึงอาร์เรย์การป้อนข้อมูลโดยตรงจากดัชนี: แต่ฉันไม่สามารถหาวิธีกะทัดรัดในการปกป้องมันจากดัชนีออกนอกช่วง (ในขณะที่รักษามันไว้ที่จุดเริ่มต้น)

ป้อนคำอธิบายรูปภาพที่นี่


1

Swift, 63 ไบต์

func a(d:[Int]){var i=0;while i<d.count{print(d[i]);i+=d[i]+1}}

นี่เป็นรายการแรกของฉันเลยฉันไม่แน่ใจ 100% เกี่ยวกับกฎ แต่หวังว่าคำตอบนี้จะพอเพียง ฉันไม่แน่ใจเกี่ยวกับกฎเล็กน้อยเกี่ยวกับวิธีการป้อนข้อมูลเข้าสู่ระบบ ฉันมีคำตอบที่สั้นกว่านี้หากฉันได้รับอนุญาตให้ทำหน้าที่บางอย่างที่สามารถส่งคืนอินพุตได้


ยินดีต้อนรับสู่ PPCG! กฎเริ่มต้นคือคุณสามารถมีรหัสที่ทำงานเป็นโปรแกรมเต็มดังนั้นอินพุต (ปกติ) ใน STDIN และเอาต์พุต (ปกติ) ถึง STDOUT หรือฟังก์ชันดังนั้นอินพุต (โดยปกติ) จากพารามิเตอร์ฟังก์ชันและเอาต์พุต (ปกติ) จาก ฟังก์ชั่นกลับมา
Stephen

@ StepHen - ขอบคุณ! ฉันเดาว่าทำให้เวอร์ชันอื่นของฉันใช้งานไม่ได้แล้ว รอคอยที่จะมีส่วนร่วมมากขึ้น!
AnonymousReality

1

Perl 6 , 31 ไบต์

{(@_,{.[1+.[0]..*]}...^0)[*;0]}

ทดสอบมัน

ขยาย:

{  # bare block lambda with implicit parameter 「@_」
  (
    # generate a sequence

    @_,

    {
      .[ # index into previous value in the sequence
        1 + .[0]  # start by skipping one plus the first element
                  # of the previous value in the sequence
        ..  *     # use that to create a Range with no end
      ]
    }

    ...^  # keep doing that until: (and throw away last value)
    0     # it generates an empty list

  )[ *; 0 ]  # from every value in the sequence, get the first element
}

เพื่อช่วยให้เข้าใจวิธีการทำงานของโค้ดโดยที่[*;0]สิ่งนี้จะสร้างลำดับดังนี้:

[0, 1, 0, 2, 5, 1, 3, 1, 6, 2],
   (1, 0, 2, 5, 1, 3, 1, 6, 2),
         (2, 5, 1, 3, 1, 6, 2),
                  (3, 1, 6, 2)

1

เยลลี่ขนาด 8 ไบต์

ḢṄ‘ṫ@µL¿

โปรแกรมเต็มรูปแบบการพิมพ์ผลลัพธ์แต่ละรายการตามด้วยการขึ้นบรรทัดใหม่ (รายการว่างจะไม่สร้างเอาต์พุต)

ลองออนไลน์!

อย่างไร?

ḢṄ‘ṫ@µL¿ - Main link: list of non-negative integers  e.g. [2,5,4,0,1,2,0]
       ¿ - while:           Iteration:  1                  2             3          4        5
      L  -   length (0 is falsey)       7                  4             3          1        0
     µ   - ...do:                                                                            stop
Ḣ        -   head (pop & modify)        2 ([5,4,0,1,2,0])  0 ([1,2,0])   1 ([2,0])  0 ([0])
 Ṅ       -   print it (and yield it)   "2\n"              "0\n"         "1\n"      "0\n"
  ‘      -   increment                  3                  1             2          1
   ṫ@    -   tail from index            [0,1,2,0]          [1,2,0]      [0]         []
         -
         -                       i.e. a resulting in the printing of: '''2
                                                                         0
                                                                         1
                                                                         0
                                                                         '''

ในที่สุดคำตอบของเยลลี่! BTW ฉันสามารถทำได้ใน 7 ไบต์
Erik the Outgolfer

และฉันยังมีฟังก์ชัน list-return ใน 18 ไบต์
Erik the Outgolfer

1

Python 3 , 35 ไบต์

f=lambda h=0,*t:t and[h,*f(*t[h:])]

ลองออนไลน์!

เรียกมันด้วยf(*l)ที่lเป็นเข้าของคุณ เนื้อหายืดกฎสำหรับอินพุต แต่ฉันรักการเปิดออกขั้นสูง




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