The Indeks Simpson adalah ukuran dari keragaman koleksi item dengan duplikat. Ini hanya probabilitas menggambar dua item yang berbeda saat memilih tanpa penggantian secara acak.
Dengan n
item dalam kelompok n_1, ..., n_k
item identik, probabilitas dua item berbeda adalah
Misalnya, jika Anda memiliki 3 apel, 2 pisang, dan 1 wortel, indeks keanekaragamannya adalah
D = 1 - (6 + 2 + 0)/30 = 0.7333
Atau, jumlah pasangan yang tidak berurutan dari berbagai item berbeda 3*2 + 3*1 + 2*1 = 11
dari 15 pasangan secara keseluruhan, dan 11/15 = 0.7333
.
Memasukkan:
String karakter A
untuk Z
. Atau, daftar karakter semacam itu. Panjangnya minimal 2. Anda mungkin tidak menganggapnya disortir.
Keluaran:
Indeks keanekaragaman Simpson karakter dalam string itu, yaitu probabilitas bahwa dua karakter diambil secara acak dengan penggantian berbeda. Ini adalah angka antara 0 dan 1 inklusif.
Saat mengeluarkan float, tampilkan setidaknya 4 digit, meskipun mengakhiri output persis seperti 1
atau 1.0
atau 0.375
OK.
Anda tidak boleh menggunakan bawaan yang secara khusus menghitung indeks keanekaragaman atau ukuran entropi. Pengambilan sampel acak yang sebenarnya baik-baik saja, selama Anda mendapatkan akurasi yang cukup pada kasus uji.
Uji kasus
AAABBC 0.73333
ACBABA 0.73333
WWW 0.0
CODE 1.0
PROGRAMMING 0.94545
Papan peringkat
Berikut adalah papan peringkat berdasarkan bahasa, milik Martin Büttner .
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/53455/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45497;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*((?:[^,\s]|\s+[^-,\s])*)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
1/
bukannya1-
. [amati ahli statistik amatir lepas landas]Jawaban:
Python 2, 72
Input mungkin berupa string atau daftar.
Saya sudah tahu bahwa itu akan menjadi 2 byte lebih pendek di Python 3 jadi tolong jangan beri tahu saya :)
sumber
<>
dilakukan kurung sudut pada posisi 36? Saya belum pernah melihat sintaks itu sebelumnya.!=
.from __future__ import barry_as_FLUFL
l=len(s);
di sanaPyth -
19131211 byteTerima kasih kepada @isaacg karena memberi tahu saya tentang n
Menggunakan pendekatan brute force dengan
.c
fungsi kombinasi.Coba di sini online .
Suite uji .
sumber
.{
dengann
- mereka setara di sini.SQL (PostgreSQL), 182 Bytes
Sebagai fungsi di postgres.
Penjelasan
Penggunaan dan Uji Coba
sumber
J, 26 byte
bagian yang keren
Saya menemukan jumlah setiap karakter dengan memasukkan
</.
string ke dirinya sendiri (~
untuk refleksif) kemudian menghitung huruf setiap kotak.sumber
(#&:>@</.~)
bisa(#/.~)
dan(<:*])
bisa(*<:)
. Jika Anda menggunakan fungsi yang tepat ini memberi(1-(#/.~)+/@:%&(*<:)#)
. Karena kurung kurawal di sekitarnya umumnya tidak dihitung di sini (meninggalkan1-(#/.~)+/@:%&(*<:)#
, tubuh fungsi) ini menghasilkan 20 byte.Python 3,
6658 BytesIni menggunakan rumus penghitungan sederhana yang disediakan dalam pertanyaan, tidak ada yang terlalu rumit. Ini adalah fungsi lambda anonim, jadi untuk menggunakannya, Anda harus memberi nama.
Disimpan 8 byte (!) Berkat Sp3000.
Pemakaian:
atau
sumber
APL,
3936 byteIni menciptakan monad yang tidak disebutkan namanya.
Anda dapat mencobanya secara online !
sumber
Pyth, 13 byte
Cukup banyak terjemahan harfiah dari solusi @ feersum.
sumber
CJam, 25 byte
Cobalah online
Implementasi formula yang cukup langsung dalam pertanyaan.
Penjelasan:
sumber
J, 37 byte
tapi saya yakin itu masih bisa dipersingkat.
Contoh
Ini hanya versi diam-diam dari fungsi berikut:
sumber
(1-(%&([:+/]*<:)+/)@(+/"1@=))
memberikan 29 byte. 27 jika kita tidak menghitung kawat gigi yang mengelilingi fungsi(1-(%&([:+/]*<:)+/)@(+/"1@=))
seperti yang biasa terjadi di sini. Catatan:=y
tepat(~.=/])y
dan kata kerja penulisan (x u&v y
=(v x) u (v y)
) juga sangat membantu.C, 89
Skor hanya untuk fungsi
f
dan tidak termasuk spasi yang tidak perlu, yang hanya termasuk untuk kejelasan. yangmain
fungsi hanya untuk pengujian.Ini hanya membandingkan setiap karakter dengan setiap karakter lain, kemudian membaginya dengan jumlah total perbandingan.
sumber
Python 3, 56
Menghitung pasangan elemen yang tidak sama, kemudian membaginya dengan jumlah pasangan tersebut.
sumber
Haskell, 83 byte
Saya tahu saya terlambat, menemukan ini, lupa memposting. Agak tidak sopan dengan Haskell yang mengharuskan saya untuk mengkonversi bilangan bulat ke angka yang dapat Anda bagi satu sama lain.
sumber
CJam, 23 byte
Byte-wise, ini adalah peningkatan yang sangat kecil dari jawaban @ RetoKoradi , tetapi menggunakan trik yang rapi:
Jumlah dari bilangan bulat n -negatif pertama sama dengan n (n - 1) / 2 , yang dapat kita gunakan untuk menghitung pembilang dan penyebut, keduanya dibagi dengan 2 , dari fraksi dalam rumus pertanyaan.
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
APL, 26 byte
Penjelasan:
≢⍵
: dapatkan panjang dimensi pertama⍵
. Mengingat yang⍵
seharusnya berupa string, ini berarti panjang string.{⍴⍵}⌸⍵
: untuk setiap elemen unik⍵
, dapatkan panjang setiap dimensi dari daftar kejadian. Ini memberikan berapa kali suatu item muncul untuk setiap item, sebagai sebuah1×≢⍵
matriks.,
: menyatukan keduanya di sepanjang sumbu horizontal. Karena≢⍵
skalar, dan nilai lainnya adalah kolom, kita mendapatkan2×≢⍵
matriks di mana kolom pertama memiliki jumlah kali suatu item terjadi untuk setiap item, dan kolom kedua memiliki jumlah total item.{⍵×⍵-1}
: untuk setiap sel dalam matriks, hitungN(N-1)
.÷/
: kurangi baris dengan pembagian. Ini membagi nilai untuk setiap item dengan nilai untuk total.+/
: jumlah hasil untuk setiap baris.1-
: kurangi dari 1sumber