Diberikan input dari daftar bilangan bulat positif dengan beberapa diganti dengan 0
, output daftar dengan angka-angka yang hilang yang diubah untuk 0
diganti.
Karakteristik daftar input:
Daftar akan selalu memiliki paling sedikit 2.
Mari kita mendefinisikan daftar input sebagai
a
dan "daftar asli" (yaitu, daftar sebelum nomor diganti dengan0
s) sebagaib
. Untuk apa punn
,a[n]
apakahb[n]
atau0
.Untuk apa pun
n
,b[n]
apakahb[n-1] + 1
ataub[n-1] - 1
. Artinya, angka-angka dib
akan selalu berubah1
setiap indeks dari sebelumnya. Elemen pertama, tentu saja, dibebaskan dari aturan ini.Untuk setiap proses nol di
a
(yaitu, elemen berturut-turut diganti dengan0
), denganx
mewakili indeks awal menjalankan dany
mewakili akhir,a[x-1]
untuka[y+1]
akan selalu menjadi hanya meningkat atau semata-mata menurun. Karena itu, hanya akan ada satu cara yang mungkin untuk mengisi nol.- Ini juga berarti bahwa baik elemen pertama maupun terakhir dari array tidak dapat bernilai nol.
Dalam istilah yang lebih sederhana, untuk mengisinya dengan angka nol, cukup ganti dengan rentang dari angka sebelum ke angka yang mengikutinya. Misalnya, input dari
1 2 0 0 0 6 7
harus keluar
1 2 3 4 5 6 7
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Kasus uji:
In Out
-----------------------------------------------------
1 0 0 0 5 6 0 4 0 0 1 | 1 2 3 4 5 6 5 4 3 2 1
7 6 0 0 3 0 0 0 7 0 5 | 7 6 5 4 3 4 5 6 7 6 5
1 0 3 0 5 0 3 0 5 0 7 | 1 2 3 4 5 4 3 4 5 6 7
14 0 0 0 0 0 0 0 0 23 | 14 15 16 17 18 19 20 21 22 23
sumber
0
program kami dapat mengambil nilai lain sepertinull
?0
.Jawaban:
JavaScript (ES6),
72 66 64 5453 byteDisimpan 12 byte berkat @Neil!
Disimpan 1 byte berkat @IsmaelMiguel
Cukup bagus untuk JavaScript.
Coba online (semua browser berfungsi)
Penjelasan
sumber
a.find((q,r)=>r>i&&q)>b?++b:--b
sama denganb+=a.find((q,r)=>r>i&&q)>b||-1
MATL , 11
12byteBekerja dengan rilis saat ini (13.0.0) dari bahasa / kompiler.
Cobalah online!
sumber
Haskell,
686158 byteContoh penggunaan:
g.filter(>0) $ [7,6,0,0,3,0,0,0,7,0,5]
->[7,6,5,4,3,4,5,6,7,6,5]
.Cara kerjanya: hapus nol dari input, lalu panggil
g
. Membiarkana
menjadi elemen pertama danb
kemudian kedua dari daftar yang tersisa. Menggabungkan daftar daria
atas keb-1
dan daria
bawah keb+1
(salah satunya akan kosong) dan panggilan rekursif dengana
menjatuhkan.Sunting: @Zgarb menyimpan 3 byte. Terima kasih!
sumber
Mathematica, 59 byte
Kasus cobaan
sumber
Perl,
4745443937 byteTermasuk +1 untuk
-p
Harapkan daftar di stdin. Contoh: echo 1 0 3 0 1 | perl -p file.pl
sumber
Jelly,
1211 byteCobalah online!
Versi alternatif, 8 byte (tidak bersaing)
Sayangnya, Jelly's
pop
tidak bisa menggunakan iterable, di versi terbaru yang ada sebelum tantangan ini. Ini telah diperbaiki, dan berikut ini berfungsi dalam versi saat ini.Cobalah online!
Bagaimana itu bekerja
Dalam versi alternatif,
ḢWW;
menjadi tidak perlu. Namun, karena elemen pertama dilemparkan ke iterable sebelum muncul, sebenarnya tidak dimodifikasi. FinalḊ
menghapus duplikat elemen pertama.sumber
Retina,
393431 byte3 byte disimpan berkat @Martin.
Mengambil input dan memberikan output secara unary.
Kode berulang mengisi setiap tempat kosong (0)
previous_number - 1 + 2 * if_next_nonzero_number_bigger
.previous_number - 1
adalah$1
danif_next_nonzero_number_bigger
sekarang$3
.Dengan I / O desimal, kodenya adalah 51 byte, seperti yang dapat Anda lihat di penerjemah online dengan semua kasus uji .
sumber
1
di lookahead.GNU Sed (dengan
exec
ekstensi menggunakan bash), 61Skor termasuk +1 untuk
-r
opsi sed.0
s dan gantikan..
{1..4}
untuk titik akhir lokal. Keindahan dari ekspansi bash brace di sini adalah bahwa urutan yang dihasilkan akan selalu berjalan di arah yang benar, terlepas dari apakah awal atau akhir lebih besar.e
opsi padas
perintah untuk memanggil bash untuk mengevaluasi ekspansi brace ini0
yang ditemukan, melompat kembali ke awal.Ideone.
sumber
Python 2,
195111 byte (terima kasih Alex !)Input: harus berupa
[list]
int.Keluaran:
[list]
dari intsumber
Perl,
8582 bytetermasuk +1 untuk
-p
Harapkan daftar di stdin. Contoh:
echo 1 0 3 0 1 | perl -p file.pl
.Ini menggunakan regexp bersarang. Dapat dibaca:
sumber
Python 2,
9288 byte(Variabel perantara yang dihapus)
sumber
Pyth, 17 byte
Cara kerjanya:
Dengan kata lain: semua nol dihapus dari input, lalu rentang eksklusif dimasukkan di antara setiap elemen. Rentang ini adalah nol panjang pada elemen yang hanya satu terpisah.
sumber
05AB1E , 3 byte (tidak bersaing)
Ini adalah fitur yang ditambahkan setelah tantangan. Kode:
Penjelasan:
Cobalah online! atau Verifikasi semua kasus uji!
sumber
Vim: 231 Perintah Utama
Perhatikan bahwa setiap ^ yang mendahului karakter berarti Anda harus memegang kendali saat mengetik karakter itu
Langkah-langkah agar Anda dapat menjalankan ini juga!
:s/\^V/<Ctrl-V><Ctrl-V>/g
dan tekan enter (keduanya harus memberi Anda warna biru ^ V):s/\^R/<Ctrl-V><Ctrl-R>/g
dan tekan enter (Anda akan melihat biru ^ Rs sekarang):s/\^X/<Ctrl-V><Ctrl-X>/g
dan tekan enter (Anda akan melihat biru ^ Xs sekarang):s/\^O/<Ctrl-V><Ctrl-O>/g
dan tekan enter:s/\^A/<Ctrl-V><Ctrl-A>/g
dan tekan enter:s/\^\[/<Ctrl-V><Ctrl-[>/g
dan tekan enter (perintah ini sedikit berbeda karena saya harus keluar dari [)0"yy$
. Perintah sekarang disimpan dalam register y@y
Jika seseorang tahu cara yang lebih baik untuk membagikan perintah, beri tahu saya. Saya tahu ini panjang, tapi itu yang terbaik yang bisa saya lakukan.
Input output
String input harus sendiri pada baris apa pun dalam file. 1 0 0 4 3 0 0 0 7
Outputnya hanya akan menimpa string input 1 2 3 4 3 4 5 6 7
Penjelasan
Algoritma
Macro Digunakan
@ e - Periksa akhir. Nomor terakhir akan memiliki e ditambahkan ke dalamnya. Jika angka di bawah kursor memiliki e di bagian akhir, hapus e dan hentikan eksekusi. Jika tidak, mulailah siklus interpolasi dengan @b.
@b - Mulai siklus interpolasi. Simpan angka di bawah kursor untuk operasi pengurangan (@s) dan kemudian cari istilah non-nol berikutnya (@f)
@ s - Menyimpan perintah pengurangan untuk digunakan dalam @d. Itu hanya di
(val)^X
mana(val)
nomor pada awal langkah interpolasi. Ini diatur oleh perintah @b.@ f - Temukan istilah bukan nol berikutnya. Tulis nilai saat ini ke register tanpa nama, kemudian tulis
@f @d
di baris berikutnya, dan kemudian jalankan @z. Ini akan mengulangi perintah ini jika angkanya nol, dan jalankan @d jika tidak.@z - Eksekusi bersyarat jika register tanpa nama adalah 0. Perintah ini mengharapkan dua perintah pada baris baru dalam format
command1 command2
. Jika register tanpa nama adalah 0,command1
dieksekusi, jikacommand2
tidak dieksekusi. Perhatikan bahwa tidak ada perintah yang memiliki spasi di dalamnya.@t - Register perintah sementara. Menyimpan berbagai perintah untuk waktu yang singkat sebelum menjalankannya. Digunakan terutama dalam pernyataan if.
@ d - Tentukan arah interpolasi. Kurangi angka pertama dalam urutan dari angka di bawah kursor (menggunakan @s). Jika hasilnya negatif, interpolasi harus menurun sehingga ^ X disimpan ke @a. Kalau tidak, kita harus naik sehingga ^ A disimpan ke @a. Setelah ini disimpan, kembali ke awal siklus interpolasi ini dan jalankan @i untuk benar-benar interpolasi
@a - Menyimpan
^A
atau^X
menambah atau mengurangi selama langkah interpolasi. Ini diatur oleh perintah @d.@ i - Interpolasi. Salin nomor di lokasi saat ini ke @x dan pindah ke nomor berikutnya. Jika angka itu nol, ganti dengan @x dan jalankan @a untuk memodifikasinya naik atau turun, lalu ulangi perintah ini. Jika angkanya bukan nol, kami telah mencapai akhir dari siklus interpolasi ini. Yang baru harus dimulai dengan angka ini sebagai awal, jadi jalankan @e untuk memeriksa akhirnya dan jalankan lagi.
@x - Register penyimpanan sementara. Digunakan dalam perintah interpolasi (@i)
Memecah penekanan tombol
sumber
Python 3.5, 159 byte
solusi rekursif
Tidak disatukan
Dalam solusi golf, saya mengganti kondisi dengan menggunakan fakta itu
h*True=h
danh*False=[]
Hasil
sumber
Perl 6 , 54 byte
sumber
MATLAB,
393837 byteFungsi anonim yang diinterpolasi secara linear antara titik-titik di
a
.find(a)
adalah array indeks elemen bukan nola
dana(a>0)
merupakan nilai positif. Disimpan 1 byte berkat saran teman>
daripada~=
.sumber