Lewati seperti katak!

12

Diberikan array bilangan bulat non-negatif, tugas Anda adalah hanya menyimpan elemen tertentu, seperti dijelaskan di bawah ini.

  • Katakanlah arraynya adalah [1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1].

  • Pertama, ambil elemen pertama array n,. Simpan nelemen pertama dan buang elemen berikutnya (buang elemen n+1th). Array baru adalah [1, 2, 4, 11, 5, 2, 0, 13, 10, 1].

  • Kemudian, Anda ambil elemen mengikuti yang dihapus dan melakukan hal yang sama persis. Menerapkan kembali proses, kita dapatkan[1, 2, 11, 5, 2, 0, 13, 10, 1]

  • Anda ulangi prosesnya sampai Anda tiba di luar batas array / tidak ada elemen yang tersisa di array. Kami berhenti karena 11lebih tinggi dari panjang array.

  • Sekarang Anda harus menampilkan hasilnya.

Input / output dapat diambil / disediakan dalam bentuk standar apa pun. Array tidak akan pernah kosong, dan hanya akan berisi bilangan bulat non-negatif. Semua celah standar dilarang.

Ini adalah sehingga kode terpendek dalam byte menang!


Uji Kasus

Input -> Output

[1, 2, 3, 4, 5] -> [1, 3, 4]

[6, 1, 0, 5, 6] -> [6, 1, 0, 5, 6]

[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1] -> [1, 2, 11, 5, 2, 0, 13, 10, 1]

[2, 2, 2, 2, 2, 2] -> [2, 2]

[1, 2, 3, 1, 2, 3, 1, 2, 3] -> [1, 2]

[3, 1, 2, 4, 0] -> [] *

* Kasus tes terakhir melibatkan 0, jadi saya memutuskan untuk mengirim proses sehingga lebih jelas:

[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )

( Terinspirasi oleh tantangan ini oleh Erik the Outgolfer )


sumber
Saya telah menulis semua kotak uji sepenuhnya dengan tangan, tolong beri tahu saya jika Anda merasa ada kesalahan!
1
Mengapa 2dihapus pada langkah pertama alih-alih 3?
Leaky Nun
@ LeakyNun Kesalahan saya. Mengoreksi. Ping saya jika saya melakukan kesalahan lain
test case yang disarankan:[1, 2, 3, 1, 2, 3, 1, 2, 3]
Rod
1
Jadi untuk memperjelas, ketika Anda pindah ke " n" baru Anda, Anda selalu mulai dari awal array untuk menjaga nelemen? Tidak (seperti yang saya pikir pada pandangan pertama) menyimpan nelemen di mana elemen pertama adalah nAnda mengevaluasi?
Brian J

Jawaban:

1

Pyth, 18 byte

#IgZlQB .(Q=Z@QZ)Q

Coba di sini.

Erik the Outgolfer
sumber
Tidak .
Leaky Nun
@ LeakyNun Dan saya pikir saya sudah cukup mengujinya! darn
Erik the Outgolfer
Setidaknya periksa testcases yang diberikan.
Leaky Nun
@ LeakyNun kadang-kadang saya pikir kode memberi saya hasil yang berbeda dari apa yang sebenarnya meskipun ... memperbaiki ... tetap (oh dan btw saya agak malas untuk menghapus format dari kasus uji tbf)
Erik the Outgolfer
5

JavaScript (ES6), 45 byte

f=(a,k=0,x=a[k])=>1/x?f(a.splice(x,1)&&a,x):a

Uji kasus

Arnauld
sumber
4

Haskell , 50 byte

g.pure.(0:)adalah fungsi anonim mengambil dan mengembalikan daftar Ints, gunakan sebagai (g.pure.(0:))[1,2,3,4,5].

g.pure.(0:)
g(a,_:b:c)=g$splitAt b$a++b:c
g(a,_)=a

Cobalah online!

Bagaimana itu bekerja

  • Fungsi ini gmengambil argumen tuple yang mewakili daftar split. aadalah daftar elemen awal disimpan pada langkah sebelumnya, _adalah elemen yang akan dibuang, badalah elemen berikutnya yang akan digunakan sebagai panjang, dan cmerupakan elemen yang tersisa.
    • Jika ada cukup elemen di bagian kedua tuple untuk memilih a b, maka perpecahan baru dilakukan dan gberulang. Kalau tidak, ia berhenti dengan ahasilnya.
  • Fungsi anonim g.pure.(0:)memulai semuanya dengan memanggil gdengan tuple ([],0:l), di mana linput dan 0segera dibuang oleh g.
    • puredi sini menggunakan Applicativeinstance untuk tuple (biner), dan dengan tipe hasil dengan ([Int],[Int])mudah menempatkan argumennya sebagai elemen kedua dalam tuple dengan []sebagai elemen pertama.
Ørjan Johansen
sumber
3

Python 3 , 59 byte

f=lambda a,i=0:f(a[:a[i]]+a[a[i]+1:],a[i])if i<len(a)else a

Cobalah online!

Biarawati Bocor
sumber
Impresif! Saya memiliki pendekatan non-rekursif 65-byte (dalam Python 2).
2

Java 8, 68 byte

Lambda ini menerima dapat berubah List<Integer>(mendukung remove(int), misalnya ArrayList). Output adalah input yang dimutasi. Tetapkan untuk Consumer<List<Integer>>.

l->{for(int i=0,f=0;i<l.size();f^=1)i=f>0?l.remove(i)*0+i:l.get(i);}

Cobalah secara Online

Aliran kontrol untuk masalah ini sangat mengganggu. Setiap iterasi kita harus menghapus elemen dan mendapatkan elemen di posisi berikutnya, dan kedua operasi ini memerlukan pemeriksaan jangkauan (dan keduanya dapat memicu penyelesaian program). Salah satu strategi adalah untuk melakukan kedua operasi dalam satu iterasi loop tunggal, dengan pembaruan indeks dijaga oleh jangkauan jangkauannya sendiri. Strategi lain, yang ternyata lebih pendek, adalah bergantian antara operasi setiap loop iterasi, yang merupakan solusi yang dilakukan oleh solusi ini.

Jakob
sumber
1

APL (Dyalog Classic) , 32 byte

1∘{n∇⍣(n≤≢w)⊢w←⍵/⍨(n1+⍺⊃⍵)≠⍳≢⍵}

Penjelasan

1∘{                             } bind 1 as starting left argument (⍺)
                             ⍳≢⍵  generate indexes for right argument (⍵)
                   (n1+⍺⊃⍵)      n is 1+item at position  
              w←⍵/⍨              w is  with item at n removed
   n∇⍣(n≤≢w)⊢                     recurse with n as left and w as right arg if n <= length of w

Cobalah online!

Gil
sumber
1

Perl 5 , 38 + 1 (-a) = 39 byte

splice@F,$p=$F[$p],1while$p<@F;say"@F"

Cobalah online!

Xcali
sumber
1

Haskell, 99 byte (88 tanpa lekukan)

f x y
 |y>=l=f x$l-1
 |e>=l=x
 |True=f (take e x ++ drop (1+e) x) e
 where e=x!!y
       l=length x
Giacomo Tecya Pigani
sumber
Saya mungkin bisa menghemat 1 byte menggunakan "1 = 1" daripada "True", juga mungkin dua ruang di dekat "++" dapat dihapus
Giacomo Tecya Pigani
1

VI, 31 25 byte

O@0kdd<C-v><C-a>Y<C-v><C-x>gg@a<Esc>"add<C-a>Y<C-x>@a

<C-?>bersesuaian dengan Control + ?, dan <Esc>untuk Escapejelas. Masing-masing dihitung untuk 1 byte (lihat meta ).

Memasukkan

File input harus berisi 1 integer per baris + 1 baris kosong di akhir, contoh:

1
2
3
4
5
⁣

Kita dapat melihat setiap baris dari file input sebagai elemen array, seperti 1 :: 2 :: 3 :: 4 :: 5 :: [], seperti dalam beberapa bahasa (caml misalnya).

Meluncurkan

Anda dapat memulai vi dengan perintah berikut, dan ketikkan solusi langkah demi langkah:

vi -u NONE input

Anda juga dapat menggunakan one-liner ini:

vi -u NONE -c ':exec "norm O@0kdd\<C-v>\<C-a>Y\<C-v>\<C-x>gg@a\<Esc>\"add\<C-a>Y\<C-x>@a"' -c ":w output" -c ':q' input

Ini harus menghasilkan file outputdengan hasil yang benar dari file input input.

Penjelasan

Untuk memperkenalkan solusi, pertama-tama saya akan menyajikan solusi 19-byte yang bekerja hanya untuk array tanpa 0. Solusi ini menggunakan makro rekursif, digunakan dengan sedikit modifikasi dalam solusi akhir:

Yqa@0ddYgg@aquggY@a

Penjelasan solusi parsial

Y                       # yank first line (first integer + line break) to "0 register
 qa                     # start recording a macro ("a register)
   @0                   # jump n lines, where n is the content of the "0 register
     dd                 # delete the current line (n+1th line)
       Y                # yank current line (integer after the previously deleted line)
        gg              # go back to the first line
          @a            # recurse on macro "a"
            q           # finish recording the macro
             u          # cancel modifications done by the execution of the macro
              gg        # go back to the first line
                Y@a     # apply the recorded macro with first parameter equal to the first integer

Kuncinya di sini adalah dengan menggunakan "0register untuk menyimpan integer saat ini (dan break baris, sangat penting). Oleh karena itu, perintah ini @0memungkinkan untuk melompat nbaris (panggil nnilai "0). Jika lompatan melebihi jumlah baris dalam file, makro akan gagal, sehingga program akan berhenti (di luar batas array, seperti yang diperlukan).

Tetapi solusi ini tidak berfungsi jika inputnya berisi 0. Memang, jika "0nilai register sama 0, maka @0akan melompat satu baris (karena break baris), tidak 0seperti yang kita suka. Jadi perintah berikutnya ( dd) tidak akan menghapus bilangan bulat 0, tetapi 1 (tidak benar).

Solusi yang valid untuk mengatasinya 0adalah dengan selalu menambah bilangan bulat sebelum menariknya, dan menguranginya tepat setelahnya. Dengan demikian, @0perintah akan melompat n+1baris ( nadalah integer saat ini yang telah bertambah). Sebuah kperintah maka perlu untuk pergi ke baris n(baris sebelumnya). Menggunakan trik ini, sebuah baris kosong diperlukan di akhir file input, untuk menghindari lompatan di luar array (dengan demikian, mengakhiri program), karena kita sekarang selalu lompat n+1baris, sebelum melompat ke baris sebelumnya.

Penjelasan solusi akhir

O                                                       # insert a new line at the beginning of the file, enter insert mode to write the macro content
 @0                                                     # jump n lines                                                       
   k                                                    # go to the previous line
    dd                                                  # delete this line
      <C-v><C-a>                                        # type Control+A (C-v is needed because we are in insert mode) to increment the current integer
                Y                                       # yank the incremented integer
                 <C-v><C-x>                             # decrement the current integer
                           gg                           # go to the first line
                             @a                         # recurse on macro "a"
                               <Esc>                    # exit insert mode : at this step, the first line of the file contains the macro content @0kdd^AY^Xgg@a
                                    "add                # copy @0kdd^AY^Xgg@a line to the register "a and delete the line
                                        <C-a>           # increment the first integer
                                             Y          # yank it (into "0)
                                              <C-x>     # decrement the first integer
                                                   @a   # apply macro in a" (initial @0 will jump n+1 lines, since we incremented the first integer before calling the macro)

Menulis konten makro di dalam file sebelum mendaftar memungkinkan untuk menyimpan beberapa byte:

  • menghindari menulis qa...qdan membatalkan semua perubahan setelah mendaftar
  • hindari :let @a="...")

Suntingan

# 1

  • tulis konten makro pada baris pertama (bukan baris terakhir)
  • ubah input (1 baris kosong di akhir)
  • tambahkan satu-liner untuk menguji di baris perintah
norbjd
sumber
0

Pyth, 32 byte

VlQIgNlQBK@QNI!K=QYBIgKlQB.(QK;Q

Cobalah online

Karan Elangovan
sumber
Pyth bisa menjadi jauh lebih elegan dari itu :) #VlQ.(Q@QN;Qmelakukan pekerjaan dalam 12 byte, dan saya cukup yakin itu bisa bermain golf lebih banyak lagi
Dave
Dengan mempertahankan pendekatan Pythonic old-school yang dapat Anda lakukan W<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q(25). pendekatan pizzakingme jauh lebih baik.
4
@KaranElangovan meminta maaf, mereka hanya berusaha membantu Anda.
Leaky Nun
1
Tetap untuk kasus ujian akhir, datang ke 15 byte: #VlQ .(Q@QN)%;Q. Umpan balik dari pegolf Pyth akan disambut, saya masih belajar juga!
Dave
2
Pendekatan ini tidak valid. Tidak hanya tidak mencetak hasilnya saja, tetapi juga gagal dalam kasus uji (setidaknya yang terakhir kedua). Bisakah Anda menghapus jawaban ini / memperbaikinya?
0

C # (.NET Core) , 74 byte

n=>{for(int i=n[0];i<n.Count;){n.RemoveAt(i);i=i<n.Count?n[i]:n.Count+1;}}

Cobalah online!

Ini menerima daftar int dan memodifikasinya. Saya telah melihat beberapa jawaban Java yang menutupi impor dengan menggunakan nama yang sepenuhnya memenuhi syarat dalam definisi argumen Lambda. Jika ini tidak diizinkan, saya dapat menghapus jawaban ini.

jkelm
sumber
Jika Anda merujuk pada penghilangan jenis parameter dalam definisi lambda, itu dibolehkan .
Jakob
@ Jakob saya mengerti itu. Saya hanya merasa sedikit kotor untuk System.Collections.Generic.List<int>alih - alih using System.Collections.Genericdan menambahkannya ke jumlah byte. Tapi saya kira itu tidak ada bedanya dengan menggunakan array.
jkelm
Oh begitu. Yah Anda bisa menggunakan usingjika Anda mau; selama lambda itu sendiri tidak bergantung pada pernyataan Anda tidak perlu memasukkannya dalam jumlah byte. Secara pribadi saya selalu menggunakan nama-nama yang sepenuhnya memenuhi syarat dalam kode uji hanya agar jelas dan mudah diverifikasi apa yang impor menggunakan lambda.
Jakob
0

R , 64 53 byte

f=function(a,i=1,d=a[i]+1)"if"(is.na(d),a,f(a[-d],d))

Fungsi rekursif. Memiliki satu input wajib a,, daftar untuk dilewati. iadalah indeks dari jumlah hal untuk dilompati (default ke 1), dan dmerupakan indeks dari item berikutnya setelah nilai yang diperlukan telah dihapus, yang juga merupakan indeks dari item yang akan dihapus. Pengembalian numeric(0), vektor kosong, untuk output kosong.

Cobalah online!

Tidak Disatukan:

f <- function(a, i = 1, d = a[i] + 1) {
  if(is.na(d)) {   # d is NA if and only if a[i] is out of bounds
    a
  } else {
    f( a[-d], d, a[d] + 1 )   # a[-d] is a with the item at index d removed
  }
}
Giuseppe
sumber