Lewati seperti kelinci!


41

Diberikan daftar bilangan bulat non-negatif dalam format wajar apa pun, lakukan iterate di atasnya, lompati elemen sebanyak yang setiap bilangan bulat yang Anda tuju mengatakan.


Berikut ini contoh yang berhasil:

[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

Contoh lain yang berhasil, tidak semua delta sama dengan:

[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

Contoh di luar batas:

[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)

Aturan

  • Anda tidak boleh menggunakan cheat yang membosankan di antara yang ini , itu membuat tantangan menjadi membosankan dan tidak menarik.
  • Anda hanya harus mengembalikan / mencetak hasil akhir. Output STDERR diabaikan.
  • Anda mungkin tidak mendapatkan input sebagai string angka di basis apa pun (mis. "0102513162" untuk kasus pertama).
  • Anda harus menggunakan urutan input kiri-ke-kanan.
  • Seperti dalam contoh yang dikerjakan, jika Anda keluar dari batas, eksekusi berakhir seolah-olah sebaliknya.
  • Anda harus menggunakan 0untuk melewatkan 0 elemen.
  • Mengingat daftar kosong ( []) sebagai input, Anda harus kembali [].

Uji kasus

[]                                                     => []
[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]

Ini , jadi jawaban tersingkat menang!


1
Apakah saya tetap memiliki nol trailing di array saya? akan menyelamatkan saya ~ 18 byte
Roman Gräf

@EriktheOutgolfer Bisakah kita mengeluarkan array string dan memiliki string kosong?
TheLethalCoder

1
@TheLethalCoder Maaf saya akan mengatakan tidak karena itu tidak masuk akal ... tidak bisakah Anda menghapus trailing ""s?
Erik the Outgolfer

2
@ RomanGräf Maaf tapi tidak, itu akan terlalu ambigu karena ada kasus Anda harus mengekor 0di output.
Erik the Outgolfer

Jawaban:



13

Python 2 , 49 44 * 41 byte

Dicoret 44 masih teratur 44 :(

* -3 terima kasih hanya untuk @ ASCII .

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

Cobalah online!

Mencetak hasil yang dipisahkan oleh baris baru, karena OP diizinkan dalam obrolan. Saya tidak berpikir itu bisa menjadi lebih pendek sebagai program penuh non-rekursif .


Bagaimana cara kerjanya?

  • l=input() - Membaca daftar dari input standar.

  • while l: - Menyalahgunakan fakta bahwa daftar kosong adalah palsu dalam Python, loop sampai daftar kosong.

  • print l[0]; - Mencetak elemen pertama dari daftar.

  • l=l[l[0]+1:]- "Lewati seperti kelinci" - Memotong yang pertama l[0]+1dari daftar.

Mari kita ambil contoh

Mengingat daftar [5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]sebagai masukan, ini melakukan kode berikut (sesuai dengan penjelasan di atas) - Mencetak item pertama dari array: 5, memangkas pertama 6: [2, 1, 2, 1, 0, 0]. Kami kemudian mencetak 2dan trim pertama 3: [1,0,0]. Demikian juga, kami menghasilkan 1, memotong 2 yang pertama, dan kami dapatkan [0]. Tentu saja, 0dicetak dan program berakhir.




9

JavaScript (ES6), 42 39 35 byte

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]

Solusi Lama 39 Bytes

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

-3 byte berkat @ThePirateBay


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


8

Mathematica, 46 44 byte

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

Alternatif:

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

7

C #, 68 byte

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

Cobalah online!

Versi Lengkap / Terformat:

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

Mengembalikan daftar lebih lama di 107 byte.

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
Mengapa seseorang membatalkan ini?
TheLethalCoder

Untuk melengkapi skor Anda dan membuat 5k sempurna?
Thomas Ayoub

@ThomasAyoub Kita hanya bisa berasumsi itu seseorang dengan OCD ya.
TheLethalCoder

6

Sekam , 8 6 byte

←TU¡Γ↓

Cobalah online!

-2 byte (dan ide solusi yang sama sekali baru) terima kasih kepada Leo!

Penjelasan

Saya menggunakan fungsi pencocokan pola daftar Γ. Dibutuhkan fungsi fdan daftar dengan kepala xdan ekor xs, dan berlaku funtuk xdan xs. Jika daftar kosong, Γmengembalikan nilai default yang konsisten dengan tipenya, dalam hal ini daftar kosong. Kami mengambil fmenjadi , yang menjatuhkan xelemen dari xs. Fungsi ini kemudian diulang dan elemen yang dihasilkan dikumpulkan dalam daftar.

←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]

Anda dapat menjatuhkan nilai default ø, dan semuanya akan tetap berfungsi secara ajaib :)
Leo

Atau, untuk byte yang lebih sedikit lagi, tio.run/##yygtzv7//1HbhJDQQwvPTX7UNvn////RBjpGOiBsomOoYxQLAA
Leo

@ Leo Oh wow, itu pintar!
Zgarb

Mengapa Anda CW ini?
Erik the Outgolfer

@ErikTheOutgolfer Itu kesalahan (saya di ponsel saya dan tampaknya mendorong sesuatu secara tidak sengaja). Saya mencoba untuk membatalkannya ...
Zgarb


5

Pyth, 22 Bytes

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

Menghapus byte yang tidak berguna


Saya melihat 23 byte di sana.
Erik the Outgolfer

Typo :) maaf ...
Dave

3
Saya tidak yakin mengapa Anda memilih turun. Ada kemungkinan bahwa ketika Anda diedit memperbaiki jawaban Anda ini memicu "suara turun otomatis". Alasan untuk downvote otomatis ini membingungkan dan mengerikan tetapi itu terjadi jika sistem menganggap jawaban Anda "berkualitas rendah" berdasarkan heuristiknya. Mungkin juga seseorang tidak menyukai jawaban Anda, tapi saya tidak melihat ada yang salah dengan itu saat ini jadi saya tidak yakin mengapa itu akan terjadi.
Wheat Wizard

Saya senang Anda menggunakan Pyth!
isaacg


3

Retina , 36 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Input dan output dipisahkan linefeed dengan linefeed line.

Cobalah online! (Gunakan koma alih-alih umpan baris untuk memungkinkan suite pengujian yang nyaman.)


3

Brain-Flak , 64 byte

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

Cobalah online!

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

7
Sial! Saya menulis sebuah solusi, dan kemudian menggulir ke bawah untuk mempostingnya, tetapi ternyata kami menulis solusi byte-for-byte yang persis sama! Bahkan detail kecil seperti ({}[()]<{}>)vs ({}<{}>[()])adalah sama! Kebetulan sekali!
DJMcMayhem

@DJMcMayhem mencuri semua ketenaran XD
Christopher

Saya juga membuat byte untuk solusi identik dengan byte, tetapi saya memasukkannya ke dalam 4 byte . Hanya beberapa kompetisi yang tertunda :)
Wheat Wizard

2

Mathematica, 64 50 byte

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

Saya tidak bisa menahan diri untuk terus bermain golf dengan kode yang rapi ini; jawaban saya di bawah.
Mr.Wizard

2

C # (.NET Core) , 68 byte

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

Cobalah online!

Mengambil input sebagai array bilangan bulat, mengembalikan string yang berisi nilai yang tidak dilewati.


Cara yang bagus untuk melakukannya dan masuk dalam hitungan yang sama dengan mencetak.
TheLethalCoder

Saya suka solusi sederhana. Masih harus belajar LINQ, karena saya telah melihat bahwa memperpendek begitu banyak c # lambdas ..
jkelm

Persingkat karena Anda dapat secara implisit mengembalikan sebagian besar waktu. Meskipun itu adalah melemparkan antara pengembalian implisit dengan using System.Linq;dan loop normal.
TheLethalCoder

2

R, 58 byte

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

Fungsi rekursif. Mengambil vektor xsebagai argumen dan memulai pointer p. Ini mencetak entri yang sesuai x, memeriksa apakah p+x[p]akan keluar dari batas, dan jika tidak, memanggil fungsi untuk pointer baru.

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

Ini adalah solusi yang sebanding yang mengembalikan vektor yang tepat alih-alih mencetak angka.


bagaimana dengan input numeric(0)? alias array kosong.
Giuseppe

@ Giuseppe Saya akan melihatnya ketika saya berada di belakang pc saya
JAD


2

Java (OpenJDK 8) , 53 byte

Terima kasih kepada @ PunPun1000 dan @TheLethalCoder

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

Cobalah online!


Akankah mencetak hasilnya, seperti dalam jawaban C # saya, akan menyelamatkan Anda?
TheLethalCoder

@TheLethalCoder Ill try
Roman Gräf

Bisakah Anda menyimpan byte dengan pindah nke loop?
TheLethalCoder

Plus ini sepertinya tidak berfungsi saat ini.
TheLethalCoder

Anda kehilangan paren setelah (a[n+=1+a[n]]. Fungsi juga melempar kesalahan setelah mengeluarkan nilai yang benar, saya tidak tahu konsensus tentang apakah ini diizinkan atau tidak (pertanyaannya tidak mengatakan apa-apa untuk kesalahan standar diabaikan). Jika itu maksudnya, maka Anda dapat menghapus n<a.lengthin for loop. Akhirnya kode TIO tidak berjalan apa adanya, bahkan dengan paren. Fungsi harus a Consumer<int[]>dan digunakanfunc.accept(test)
PunPun1000

2

Alice , 15 byte

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

Cobalah online!

Input dan output daftar bilangan bulat desimal yang dipisahkan baris baris.

Penjelasan

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

Menyimpan integer n dalam antrian iterator menyebabkan perintah selanjutnya dieksekusi n kali. Mirror like /bukan perintah, jadi perintah selanjutnya adalah I. Oleh karena itu jika kita hanya membaca dan mencetak nilai x , kita akan membaca nilai x +1 pada iterasi berikutnya, dengan yang terakhir berakhir di atas tumpukan. Ini melewatkan elemen daftar nomor yang diperlukan.


2

Mathematica , 37 (30?)

Lebih lanjut golf metode pengguna202029 baik.

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

Aturan tampaknya tidak secara spesifik menentukan format output, jadi mungkin:

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

Output untuk fungsi kedua terlihat seperti: 0.2.4.{}- terutama {}masih dikembalikan untuk set kosong, sesuai dengan aturan final.


1
±Drop[{x},a]dapat ±{x}~Drop~akarena ±memiliki prioritas lebih rendah dari Infix.
JungHwan Min

@JungHwanMin Aku merindukan itu; Terima kasih!
Mr.Wizard


2

Brain-Flak , 64 60 byte

Hemat 4 byte berdasarkan ide dari 0 '

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

Cobalah online!

Beranotasi

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

Python 2.4, 85 byte

Tidak ada kesempatan untuk menang dengan python, tapi saya suka oneliners dan yang ini mungkin menarik bagi orang lain.
Ternyata, ada trik sulap yang bagus untuk mengakses daftar bangunan di dalam pemahaman, tetapi hanya berfungsi dalam 2,4 dan dengan beberapa pengeditan di <= 2.3
locals()['_[1]']. Python membuat nama rahasia _[1]untuk daftar, saat itu dibuat dan menyimpannya di locals. Juga nama _[2], _[3]... digunakan untuk daftar bersarang.

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

Jadi menghitung jumlah elemen yang sudah ditambahkan ditambah jumlahnya. Hasilnya adalah indeks elemen yang diinginkan berikutnya.
Saya pikir, harus ada cara untuk menghindari pencacahan. Seperti mengakses masukan berbagai langsung oleh index: [ n[len(locals()['_[1]'])+sum(locals()['_[1]'])] for ... ]. Tapi saya tidak bisa menemukan cara yang kompak untuk melindunginya dari indeks di luar jangkauan (sambil tetap di tempat)

masukkan deskripsi gambar di sini


1

Swift, 63 byte

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

Ini adalah entri pertama saya, jadi saya tidak 100% yakin pada aturan, tapi semoga jawaban ini mencukupi. Saya sedikit tidak yakin aturan tentang cara memasukkan input ke dalam sistem. Saya memiliki jawaban yang lebih pendek jika saya diizinkan untuk menggunakan fungsi di suatu tempat yang dapat mengembalikan input.


Selamat datang di PPCG! Aturan standarnya adalah Anda dapat memiliki kode yang berfungsi sebagai program penuh, jadi masukan (biasanya) di STDIN dan keluaran (biasanya) ke STDOUT, atau fungsi, jadi masukan (biasanya) dari parameter fungsi dan keluaran (biasanya) dari fungsi kembali.
Stephen

@LangkahHen - terima kasih! Saya kira itu membuat versi saya yang lain menjadi tidak valid. Berharap untuk berkontribusi lebih banyak!
AnonymousReality

1

Perl 6 , 31 byte

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

Menguji

Diperluas:

{  # 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
}

Untuk membantu memahami cara kerja kode, tanpa [*;0]ini akan menghasilkan urutan seperti berikut:

[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

Jelly , 8 byte

ḢṄ‘ṫ@µL¿

Program lengkap yang mencetak hasil masing-masing diikuti oleh baris baru (daftar kosong tidak menghasilkan keluaran).

Cobalah online!

Bagaimana?

ḢṄ‘ṫ@µ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
                                                                         '''

Akhirnya jawaban Jelly! BTW saya bisa melakukannya dalam 7 byte.
Erik the Outgolfer

Dan saya juga memiliki fungsi daftar-kembali dalam 18 byte.
Erik the Outgolfer

1

Python 3 , 35 byte

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

Cobalah online!

Jalankan dengan di f(*l)mana linput Anda. Bisa dibilang meregangkan aturan untuk input, tapi saya hanya suka membongkar canggih.




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.