Diambil dari pertanyaan ini di Stack Overflow. Terima kasih juga kepada @miles dan @Dada karena menyarankan input uji yang mengatasi beberapa kasus sudut.
Tantangan
Diberikan array nilai integer, hapus semua nol yang tidak diapit oleh beberapa nilai bukan nol.
Secara setara, sebuah entri harus disimpan baik jika bukan nol atau jika nol yang langsung dekat dengan nilai bukan nol.
Entri yang disimpan harus mempertahankan dalam output urutan yang mereka miliki di input.
Contoh
Diberikan
[2 0 4 -3 0 0 0 3 0 0 2 0 0]
nilai-nilai yang harus dihapus ditandai dengan x
:
[2 0 4 -3 0 x 0 3 0 0 2 0 x]
dan hasilnya harus
[2 0 4 -3 0 0 3 0 0 2 0]
Aturan
Array input mungkin kosong (dan kemudian output juga harus kosong).
Format input dan output fleksibel seperti biasa: array, daftar, string, atau apa pun yang masuk akal.
Golf kode, paling sedikit terbaik.
Uji kasus
[2 0 4 -3 0 0 0 3 0 0 2 0 0] -> [2 0 4 -3 0 0 3 0 0 2 0]
[] -> []
[1] -> [1]
[4 3 8 5 -6] -> [4 3 8 5 -6]
[4 3 8 0 5 -6] -> [4 3 8 0 5 -6]
[0] -> []
[0 0] -> []
[0 0 0 0] -> []
[0 0 0 8 0 1 0 0] -> [0 8 0 1 0]
[-5 0 5] -> [-5 0 5]
[50 0] -> [50 0]
code-golf
number
array-manipulation
Luis Mendo
sumber
sumber
_2
bukan-2
? Beberapa bahasa menggunakan format itu.-0
?[010 0 0 01 1]
?Jawaban:
JavaScript (ES6), 35 byte
Bekerja pada pelampung juga untuk dua byte tambahan.
sumber
Python, 50 byte
Fungsi rekursif yang membutuhkan tuple. Termasuk elemen pertama jika ada nilai bukan nol di antara dua elemen pertama atau nilai sebelumnya yang disimpan dari waktu lalu. Kemudian, hapus elemen pertama dan berulang. Elemen sebelumnya disimpan dalam daftar tunggal
p
, yang secara otomatis dikemas ke daftar dan mulai kosong (terima kasih kepada Dennis untuk 3 byte dengan ini).55 byte:
Menghasilkan semua potongan panjang-3 dari daftar, pertama menempatkan nol pada awal dan akhir, dan mengambil elemen middle dari mereka yang tidak semuanya nol.
Pendekatan berulang ternyata lebih lama (58 byte)
Ini tidak bekerja karena
b,*l
membutuhkan Python 3, tetapi Python 3input
memberikan string. Inisialisasi juga jelek. Mungkin pendekatan rekursif yang sama akan berhasil.Sayangnya, metode pengindeksan
tidak berfungsi karena
l[-1:2]
diartikan-1
sebagai akhir dari daftar, bukan titik sebelum mulainya.sumber
Haskell,
5548 byteContoh penggunaan:
h [0,0,0,8,0,1,0,0]
->[0,8,0,1,0]
.scanr
membangun kembali daftar inputx
dengan tambahan0
di awal dan akhir. Dalam setiap langkah, kami memadukan pola 3 elemen dan mempertahankan elemen tengah jika setidaknya ada satu elemen non-nol.Terima kasih @xnor selama 7 byte dengan beralih dari
zip3
kescanr
.sumber
h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t]
, tetapi saya kira tidak ada cara singkat untuk benar-benar mendapatkan elemen kedua dari 3-tuple.scan
darizip3
:h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
.Matlab,
2927 byteInput harus terdiri dari
1*n
matriks (jikan=0
memungkinkan). (Ini akan menimbulkan kesalahan untuk0*0
matriks.)sumber
's'
bukannya'same'
<- :-D'UniformOutpout'
(dapat dimengerti). Tetapi saya tidak tahu tentang yang ini~~a
bukana.*a
?logical
array. Ini sering merupakan masalah bagi built-in yang tidak ditulis dalam Matlab itu sendiri. Kalau tidak, array logis berperilaku sangat mirip dengan yang bernomor. Mungkin berfungsi dalam pemikiran Octave, tetapi saya belum menginstalnya saat ini.J,
1714 byteDisimpan 3 byte dengan bantuan dari @ Zgarb.
Pemakaian
Penjelasan
Coba di sini.
sumber
0<
bekerja di tempat0~:
?MATL , 8 byte
Output adalah string dengan angka yang dipisahkan oleh spasi. Array kosong pada output ditampilkan sebagai tidak ada (bahkan bukan baris baru).
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Kode mengubah input menjadi tipe logis, yaitu entri yang bukan nol menjadi
true
(atau1
) dan entri nol menjadifalse
(atau0
). Ini kemudian dililit dengan kernel[1 2 3]
. Nilai bukan nol menyebabkan hasil bukan nol pada posisi itu dan pada posisi tetangganya. Konversi ke logika memberikantrue
nilai yang harus dijaga, jadi mengindeks input dengan yang menghasilkan output yang diinginkan.sumber
Jolf, 14 byte
Sekarang saya memikirkannya, Jolf adalah Java dari bahasa golf. mendesah Coba di sini.
Penjelasan
sumber
Python 3, 55 byte
sumber
Jelly , 9 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Perl, 34 + 1 (
-p
bendera) = 35 byteMembutuhkan flag -p untuk dijalankan. Mengambil daftar nomor sebagai imput. Contohnya :
sumber
5
jika saya input50 0
.Haskell, 48 byte
Melihat elemen sebelumnya
p
, elemen pertamah
, dan elemen setelah (jika ada), dan jika ada yang bukan nol, tambahkan dulu elemen pertamah
.Kondisinya
any(/=0)$p:h:take 1t
panjang, khususnyatake 1t
. Saya akan mencari cara untuk mempersingkatnya, mungkin dengan pencocokan pola.sumber
Retina ,
423533 byte7 byte berkat Martin Ender.
Baris terakhir diperlukan.
Verifikasi semua testcans sekaligus. (Sedikit dimodifikasi untuk menjalankan semua testcass sekaligus.)
Sepertinya bahasa yang sempurna untuk melakukan ini ... masih dikalahkan oleh sebagian besar jawaban.
sumber
Mathematica, 43 byte
sumber
C, 96 byte
Panggil
f()
dengan penunjuk ke daftar bilangan bulat, dan penunjuk ke ukuran daftar. Daftar dan ukuran dimodifikasi di tempat.Cobalah di ideone .
sumber
f(int*p,int*n)
menyimpan satu byte. Atau definisikans
sebagai parameter ke-3 (itu tidak lulus. Ini semacam OK).Brachylog ,
4438 byteCobalah online!
Bahasa ini bagus untuk membuktikan hal-hal, yang akan kita gunakan.
Predikat 0 (predikat utama)
Predikat 1 (predikat bantu)
sumber
Matlab dengan Image Processing Toolbox, 27 byte
Ini adalah fungsi anonim.
Contoh penggunaan:
sumber
imerode
, tetapi versi saya tetap lebih lama dari versi saya saat ini, kerja bagus =)Utilitas Bash + GNU, 25
Menerima input sebagai daftar yang dipisahkan oleh baris baru.
Ideone - dengan kode test driver ditambahkan untuk menjalankan semua testcases bersama dengan mengkonversi ke / dari spasi dan dipisahkan oleh baris.
sumber
Cheddar , 78 byte
Suite uji.
Cheddar tidak memiliki filter, jadi penyaringan dilakukan dengan membungkus elemen yang kita inginkan dan mengubah elemen yang tidak kita inginkan menjadi array kosong, dan kemudian menggabungkan semuanya.
Misalnya,
[0,0,0,8,0,1,0,0]
menjadi[[],[],[0],[8],[0],[1],[0],[]]
, dan kemudian array gabungan akan menjadi[0,8,0,1,0]
.sumber
.reduce((+))
->.sum
APL, 14 byte
Uji:
Penjelasan:
0,⍵,0
: tambahkan nol ke awal dan akhir ⍵×3∨/
: temukan tanda GCD dari setiap kelompok yang terdiri dari tiga angka yang berdekatan (ini akan menjadi 0 jika semuanya nol dan 1 sebaliknya).⍵/⍨
: pilih semua item dari ⍵ yang hasilnya 1.sumber
Ruby 2.x, 63 byte
Terima kasih karena sudah waktunya, ini pada dasarnya adalah port jawaban ES6 superior Neil.
Ini juga pengiriman pcg pertama saya. yay.
sumber
Brain-Flak 142 byte
Cobalah online!
Penjelasan
sumber