Dengan diberikan daftar bilangan bulat yang benar-benar positif, telusuri setiap angka berbeda dan gantilah semua kemunculannya dengan indeks berurutan (nol atau satu berdasarkan) dari seri baru.
Contohnya
[]
→ []
/[]
[42]
→ [0]
/[1]
[7,7,7]
→ [0,1,2]
/[1,2,3]
[10,20,30]
→ [0,0,0]
/[1,1,1]
[5,12,10,12,12,10]
→ [0,0,0,1,2,1]
/[1,1,1,2,3,2]
[2,7,1,8,2,8,1,8,2,8]
→ [0,0,0,0,1,1,1,2,2,3]
/[1,1,1,1,2,2,2,3,3,4]
[3,1,4,1,5,9,2,6,5,3,5,9]
→ [0,0,0,1,0,0,0,0,1,1,2,1]
/[1,1,1,2,1,1,1,1,2,2,3,2]
Jawaban:
JavaScript (ES6), 26 byte
1-diindeks.
Cobalah online!
Berkomentar
sumber
-~
sebelumnya - itu adalah permata mutlak.a
untuk menyimpan nilai-nilai, tetapi diperlukan untuk-
/~
indeks sehingga tidak ada byte yang disimpan.-~
sebenarnya merupakan alternatif yang biasa digunakan untuk+1
(karena memiliki prioritas berbeda) dalam banyak bahasaR , 27 byte
Cobalah online!
Penjelasan:
ave(x,x,FUN=seq)
membagi vektorx
menjadi sub-vektor menggunakan nilai-nilaix
sebagai kunci pengelompokan. Kemudianseq
fungsi dipanggil untuk masing-masing kelompok dan setiap hasil diatur kembali ke posisi kelompok semula.Lebih baik lihat contoh:
Catatan :
seq(y)
fungsi mengembalikan urutan1:length(y)
jikay
memilikilength(y) > 1
, tetapi mengembalikan urutan dari1:y[1]
jikay
hanya mengandung satu elemen.Untungnya ini bukan masalah karena dalam kasus itu R - mengeluh dengan banyak peringatan - hanya memilih nilai pertama yang kebetulan yang kita inginkan :)
sumber
ave
sebelumnya.MATL , 4 byte
Solusi ini berbasis 1
Cobalah di MATL Online !
Penjelasan
Gunakan
[1,2,3,2]
sebagai contohsumber
APL (Dyalog Unicode) , 7 byte
Banyak, banyak terima kasih kepada H.PWiz, Adám dan dzaima atas semua bantuan mereka dalam debugging dan memperbaiki ini.
Cobalah online!
Penjelasan
Versi 10-byte non-diam-diam akan lebih mudah dijelaskan terlebih dahulu
Versi diam-diam melakukan tiga hal
⍵
digunakan dalam,\⍵
sebagai,\
di sebelah kanan dengan sendirinya dapat secara implisit mengetahui bahwa itu seharusnya beroperasi pada argumen yang benar.⍵=
, kita ganti⍵
dengan⊢
, yang merupakan argumen yang benar⍵
), kami dapat menghapus kurung kurawal{}
karena fungsi tacit tidak menggunakannyasumber
AWK , 14
Cobalah online!
Di atas melakukan pengindeksan satu berbasis. Jika Anda lebih suka pengindeksan berbasis nol, ini merupakan byte tambahan:
Cobalah online!
sumber
{print++a[$1]}
tanpa ruang tampaknya berfungsiJ , 7 byte
Cobalah online!
1-diindeks.
Penjelasan:
K (oK) ,
1110 byte-1 byte terima kasih kepada ngn!
Cobalah online!
sumber
='
->=
Python 2 , 48 byte
Cobalah online!
sumber
05AB1E , 4 byte
Cobalah online! atau sebagai Test Suite
Penjelasan
sumber
C # (Visual C # Interactive Compiler) , 44 byte
Cobalah online!
sumber
[7,7,7]
harus keluar[0,1,2]
, dan tidak[0,0,0]
.Python 2 ,
4743 byteCobalah online!
Solusi 'berbasis satu' rekursif.
sumber
Jelly , 4 byte
Cobalah online!
Untuk setiap awalan daftar input, ia menghitung jumlah kemunculan elemen terakhir itu sendiri.
sumber
;\ċ"
juga 4.R , 41 byte
Cobalah online!
Anehnya, mengembalikan indeks berbasis nol lebih pendek di R.
sumber
Ruby, 35 byte
Sayangnya ini cukup biasa - membangun hash yang menyimpan total untuk setiap entri yang ditemukan sejauh ini.
Beberapa opsi lain yang menyenangkan yang sayangnya tidak cukup pendek:
sumber
R ,
6243 byte-19 byte terima kasih kepada Giuseppe, dengan menghapus yang mana, dan tabel, dan hanya sedikit perubahan pada implementasi
Asli
Saya tidak bisa bersaing dengan pengetahuan Giuseppe, jadi pengajuan saya agak lebih lama dari pengetahuannya, tetapi menggunakan pengetahuan dasar saya, saya merasa bahwa solusi ini agak cerdik.
r<-table(x)
menghitung berapa kali setiap angka muncul dan menyimpannya dalam r, untuk referensi di masa mendatangnames()
mendapatkan nilai dari setiap entri unik dalam tabel, dan kami mengulangi nama-nama ini dengan for for.Bagian yang tersisa memeriksa entri mana yang sama dengan iterasi dan menyimpan urutan nilai (dari 1 hingga jumlah entri iterasi)
Cobalah online!
sumber
which()
untuk menyimpan 7 byte.1:r[i]
memberi saya ide untuk menghapustable()
seluruhnya:x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z
adalah 43 byte! Ini pendekatan yang bagus!Haskell , 44 byte
Cobalah online!
Penjelasan
Melintasi daftar dari kiri ke kanan dengan menjaga daftar
x
elemen yang dikunjungi, awalnya[]
:Untuk setiap pertemuan
y
hitungan semua elemen sama dalam daftarx
.sumber
(#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e
Cobalah online!Perl 6 , 15 byte
Cobalah online!
Anda dapat memindahkan
++
ke sebelum%
untuk indeks berbasis satu.Penjelasan:
sumber
Haskell ,
4746 byteCobalah online!
Pendekatan yang berbeda dari jawaban BMO yang ternyata sedikit lebih lama. (Dan silakan meminjam baju tes bagus mereka.)
Idenya adalah untuk beralih pada daftar input dan melacak berapa kali setiap elemen terjadi dengan memperbarui fungsi
g
. Tidak Disatukan:Dua peluang golf yang menarik muncul. Pertama untuk nilai awal
g
, fungsi konstan yang mengabaikan argumennya dan mengembalikan0
:Dan yang kedua ekspresi atas variabel
x
dany
yang menghasilkan1
jikax
samay
dan0
sebaliknya:Mungkin masih ada cara yang lebih pendek. Adakah yang punya ide?
sumber
0^(x-y)^2
.Java (JDK) , 76 byte
Cobalah online!
Kredit
sumber
for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;
kefor(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;
.Ruby , 34 byte
Cobalah online!
sumber
->a{i=-1;a.map{|v|a[0..i+=1].count v}}
dan tidak berpikir untuk hanya membangun array baru, lol. Kerja bagus.bash,
3724 byteTIO
jika valid, ada juga variasi ini, seperti yang disarankan oleh DigitalTrauma
TIO
sumber
Perl 5, 11 byte
TIO
penjelasan komentar berikut
$_
variabel khusus perl yang berisi garis saat ini saat perulangan input (-p
atau-n
switch)$h{$_}++
Autovivifies peta%h
dan membuat entri dengan kunci$_
dan kenaikan dan memberikan nilai sebelum kenaikan-p
sakelar,-l
sakelar menghilangkan ujung saluran pada input dan menambahkan ujung saluran pada keluaransumber
Pari / GP , 32 byte
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 33 byte
Cobalah online!
sumber
Attache , 23 byte
Cobalah online!
Penjelasan
sumber
C (gcc) ,
6562 byteCobalah online!
-2 byte berkat ASCII saja
Ini terasa terlalu mudah, tetapi sepertinya saya tidak bisa lebih pendek dengan pendekatan yang berbeda.
sumber
K (ngn / k) , 18 byte
Cobalah online!
PENDEKATAN TUA
K (ngn / k) ,
27 2322 byteCobalah online!
ini tidak cukup ... solusi cepat dan kotor, saya akan memperbaiki ini nanti ketika saya mendapat kesempatan untuk memikirkan pendekatan yang lebih baik
penjelasan:
=x
mengembalikan dict di mana kunci adalah item x dan nilainya adalah indeks mereka (3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)
)i:
tetapkan dict kei
#:'
menghitung nilai untuk setiap tombol (3 1 4 5 9 2 6!2 2 1 3 2 1 1
)!:'
sebutkan setiap nilai (3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0)
),/.:
ekstrak nilai dan ratakan daftar (0 1 0 1 0 0 1 2 0 1 0 0
)x[,/.:i]:
ekstrak indeks dari i, ratakan, dan tetapkan setiap nilai dari daftar sisi kanan pada indeks inimengganggu, daftar diperbarui tetapi nilai nol dikembalikan oleh tugas, jadi saya harus mengembalikan daftar setelah tanda titik koma (
;x
)sunting: menghapus titik dua yang tidak berhubungan
edit2: menghapus tugas yang tidak perlu
sumber
Retina 0.8.2 , 30 byte
Cobalah online! Tautan termasuk kasus uji. 1-diindeks. Penjelasan: Bagian pertama dari regex cocok dengan masing-masing bilangan bulat dalam daftar pada gilirannya. Grup lookbehind mencocokkan setiap kemunculan integer pada baris tersebut hingga dan termasuk integer saat ini. Bilangan bulat kemudian diganti dengan jumlah kecocokan.
sumber
Batch, 61 byte
1-diindeks. Karena substitusi variabel terjadi sebelum parsing,
set/a
perintah akhirnya menambah nama variabel yang diberikan dengan menggabungkan hurufc
dengan integer dari daftar (variabel numerik default ke nol dalam Batch). Hasilnya kemudian disalin ke integer lain untuk kemudahan output (lebih tepatnya, menghemat satu byte).sumber
Tcl , 48 byte
Cobalah online!
sumber
Japt, 8 byte
Coba di sini
sumber