Indeks Simpson jest miarą różnorodności kolekcją przedmiotów z duplikatów. Jest to po prostu prawdopodobieństwo losowania dwóch różnych przedmiotów podczas wybierania bez zamiany równomiernie losowo.
W przypadku n
przedmiotów w grupach n_1, ..., n_k
identycznych przedmiotów prawdopodobieństwo dwóch różnych przedmiotów wynosi
Na przykład, jeśli masz 3 jabłka, 2 banany i 1 marchewkę, wskaźnik różnorodności wynosi
D = 1 - (6 + 2 + 0)/30 = 0.7333
Alternatywnie, liczba nieuporządkowanych par różnych przedmiotów wynosi 3*2 + 3*1 + 2*1 = 11
ogółem z 15 par, oraz 11/15 = 0.7333
.
Wejście:
Ciąg znaków A
do Z
. Lub lista takich znaków. Jego długość będzie wynosić co najmniej 2. Nie możesz zakładać, że zostanie posortowana.
Wynik:
Indeks różnorodności Simpsona znaków w tym ciągu, tj. Prawdopodobieństwo, że dwa znaki wzięte losowo z zamianą są różne. Jest to liczba od 0 do 1 włącznie.
Kiedy wypisujesz liczbę zmiennoprzecinkową, wyświetl przynajmniej 4 cyfry, ale kończąc dokładne wyjścia jak 1
lub 1.0
lub 0.375
są OK.
Nie możesz używać wbudowanych funkcji, które konkretnie obliczają wskaźniki różnorodności lub miary entropii. Rzeczywiste losowe próbkowanie jest w porządku, o ile uzyskano wystarczającą dokładność przypadków testowych.
Przypadki testowe
AAABBC 0.73333
ACBABA 0.73333
WWW 0.0
CODE 1.0
PROGRAMMING 0.94545
Tabela liderów
Oto tabela liderów według języków, dzięki uprzejmości Martina Büttnera .
Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# 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/
zamiast1-
. [statystyczny amator rant hat off]Odpowiedzi:
Python 2, 72
Dane wejściowe mogą być ciągiem lub listą.
Wiem już, że w Pythonie 3 byłby o 2 bajty krótszy, więc proszę, nie doradzaj mi :)
źródło
<>
robią nawiasy kątowe w pozycji 36? Nigdy wcześniej nie widziałem tej składni.!=
.from __future__ import barry_as_FLUFL
l=len(s);
tamPyth -
19131211 bajtówDzięki @isaacg za poinformowanie mnie o n
Wykorzystuje podejście brutalnej siły z
.c
funkcją kombinacji.Wypróbuj tutaj online .
Zestaw testowy .
źródło
.{
zn
- są równoważne tutaj.SQL (PostgreSQL), 182 bajtów
Jako funkcja w postgresie.
Wyjaśnienie
Użycie i uruchomienie testowe
źródło
J, 26 bajtów
fajna część
Znalazłem liczby każdego znaku, wpisując
</.
ciąg znaków do siebie (~
dla zwrotności), a następnie licząc litery każdego pola.źródło
(#&:>@</.~)
może być(#/.~)
i(<:*])
może być(*<:)
. Jeśli użyjesz odpowiedniej funkcji, daje to(1-(#/.~)+/@:%&(*<:)#)
. Ponieważ otaczające nawiasy klamrowe na ogół nie są tutaj liczone (pozostawiając1-(#/.~)+/@:%&(*<:)#
, treść funkcji) daje to 20 bajtów.Python 3,
6658 bajtówKorzysta z prostej formuły liczenia podanej w pytaniu, nic zbyt skomplikowanego. Jest to anonimowa funkcja lambda, więc aby z niej skorzystać, musisz nadać jej nazwę.
Zaoszczędzono 8 bajtów (!) Dzięki Sp3000.
Stosowanie:
lub
źródło
APL,
3936 bajtówTworzy to nienazwaną monadę.
Możesz spróbować online !
źródło
Pyth, 13 bajtów
Prawie dosłowne tłumaczenie rozwiązania @ feersum.
źródło
CJam, 25 bajtów
Wypróbuj online
Dość bezpośrednie wdrożenie formuły w pytaniu.
Wyjaśnienie:
źródło
J, 37 bajtów
ale wierzę, że można to jeszcze skrócić.
Przykład
To tylko cicha wersja następującej funkcji:
źródło
(1-(%&([:+/]*<:)+/)@(+/"1@=))
daje 29 bajtów. 27, jeśli nie liczymy nawiasów otaczających funkcję,(1-(%&([:+/]*<:)+/)@(+/"1@=))
ponieważ jest to tutaj powszechne. Notatki:=y
jest dokładnie(~.=/])y
i utwórz spójnik (x u&v y
=(v x) u (v y)
) również była bardzo pomocna.C, 89
Wynik jest tylko dla funkcji
f
i wyklucza niepotrzebne białe znaki, które są uwzględniane tylko dla przejrzystości.main
funkcja dostępna jest tylko do testów.Po prostu porównuje każdą postać z każdą inną postacią, a następnie dzieli przez całkowitą liczbę porównań.
źródło
Python 3, 56
Liczy pary nierównych elementów, a następnie dzieli przez liczbę takich par.
źródło
Haskell, 83 bajty
Wiem, że się spóźniłem, znalazłem to, zapomniałem opublikować. Trochę nieelegancki w stosunku do Haskella, wymagający ode mnie konwersji liczb całkowitych na liczby, które możecie podzielić przez siebie.
źródło
CJam, 23 bajty
Bajtowo , to bardzo niewielka poprawa w stosunku do odpowiedzi @ RetoKoradi , ale używa zgrabnej sztuczki:
Suma pierwszych n nieujemnych liczb całkowitych wynosi n (n - 1) / 2 , których możemy użyć do obliczenia licznika i mianownika, oba podzielone przez 2 ułamka we wzorze pytania.
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
APL, 26 bajtów
Wyjaśnienie:
≢⍵
: uzyskaj długość pierwszego wymiaru⍵
. Jeśli się uwzględni⍵
ma to być łańcuch, oznacza to długość łańcucha.{⍴⍵}⌸⍵
: dla każdego unikalnego elementu w⍵
uzyskaj długości każdego wymiaru listy wystąpień. Daje to liczbę przypadków, w których element występuje dla każdego elementu, w postaci1×≢⍵
macierzy.,
: połącz dwa wzdłuż osi poziomej. Ponieważ≢⍵
jest skalarem, a drugą wartością jest kolumna, otrzymujemy2×≢⍵
macierz, w której pierwsza kolumna zawiera liczbę wystąpień elementu dla każdego elementu, a druga kolumna zawiera całkowitą liczbę elementów.{⍵×⍵-1}
: dla każdej komórki w macierzy obliczN(N-1)
.÷/
: zmniejsz wiersze według podziału. Dzieli to wartość dla każdego elementu przez wartość sumy.+/
: zsumuj wynik dla każdego wiersza.1-
: odejmij od 1źródło