Der Simpson-Index ist ein Maß für die Vielfalt einer Sammlung von Elementen mit Duplikaten. Es ist einfach die Wahrscheinlichkeit, zwei verschiedene Gegenstände zu zeichnen, wenn nach dem Zufallsprinzip ohne Austausch gleichförmig kommissioniert wird.
Bei n
Artikeln in Gruppen von n_1, ..., n_k
identischen Artikeln ist die Wahrscheinlichkeit für zwei unterschiedliche Artikel
Wenn Sie beispielsweise 3 Äpfel, 2 Bananen und 1 Karotte haben, beträgt der Diversitätsindex
D = 1 - (6 + 2 + 0)/30 = 0.7333
Alternativ ist die Anzahl der ungeordneten Paare von verschiedenen Gegenständen 3*2 + 3*1 + 2*1 = 11
von insgesamt 15 11/15 = 0.7333
.
Eingang:
Eine Zeichenfolge A
zu Z
. Oder eine Liste solcher Zeichen. Ihre Länge beträgt mindestens 2. Sie können nicht davon ausgehen, dass sie sortiert ist.
Ausgabe:
Der Simpson-Diversity-Index der Zeichen in dieser Zeichenfolge, dh die Wahrscheinlichkeit, dass zwei mit Ersetzung zufällig ausgewählte Zeichen unterschiedlich sind. Dies ist eine Zahl zwischen 0 und 1 einschließlich.
Zeigen Sie bei der Ausgabe eines Floats mindestens 4 Stellen an, obwohl die exakten Ausgaben wie 1
oder 1.0
oder 0.375
OK sind.
Sie dürfen keine integrierten Funktionen verwenden, die speziell Diversity-Indizes oder Entropiemaße berechnen. Tatsächliche Zufallsstichproben sind in Ordnung, solange Sie eine ausreichende Genauigkeit für die Testfälle erhalten.
Testfälle
AAABBC 0.73333
ACBABA 0.73333
WWW 0.0
CODE 1.0
PROGRAMMING 0.94545
Bestenliste
Hier ist eine sprachspezifische Rangliste mit freundlicher Genehmigung von Martin Büttner .
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# 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/
statt1-
. [Amateur Statistiker schimpfen Hut ab]Antworten:
Python 2, 72
Die Eingabe kann eine Zeichenfolge oder eine Liste sein.
Ich weiß bereits, dass es in Python 3 2 Bytes kürzer wäre, also raten Sie mir bitte nicht :)
quelle
<>
an Position 36? Ich habe diese Syntax noch nie gesehen.!=
.from __future__ import barry_as_FLUFL
l=len(s);
daPyth -
19131211 BytesVielen Dank an @isaacg, der mir von n erzählt hat
Verwendet Brute-Force-Ansatz mit
.c
Kombinationsfunktion.Probieren Sie es hier online .
Testsuite .
quelle
.{
mitn
- sie sind hier gleichwertig.SQL (PostgreSQL), 182 Bytes
Als eine Funktion in Postgres.
Erläuterung
Verwendung und Testlauf
quelle
J, 26 Bytes
das coole teil
Ich fand die Anzahl jedes Zeichens, indem ich
</.
die Zeichenkette gegen sich selbst~
drückte ( reflexiv) und dann die Buchstaben jedes Kästchens zählte.quelle
(#&:>@</.~)
kann sein(#/.~)
und(<:*])
kann sein(*<:)
. Wenn Sie eine ordnungsgemäße Funktion verwenden, gibt dies(1-(#/.~)+/@:%&(*<:)#)
. Da die umgebenden Klammern hier in der Regel nicht mitgezählt werden (wobei1-(#/.~)+/@:%&(*<:)#
der Hauptteil der Funktion übrig bleibt), ergeben sich 20 Bytes.Python 3,
6658 BytesHierbei wird die in der Frage angegebene einfache Zählformel verwendet, die nicht zu kompliziert ist. Es ist eine anonyme Lambda-Funktion. Um sie zu verwenden, müssen Sie ihr einen Namen geben.
8 Bytes (!) Gespart dank Sp3000.
Verwendung:
oder
quelle
APL,
3936 BytesDadurch entsteht eine unbenannte Monade.
Sie können es online ausprobieren !
quelle
Pyth, 13 Bytes
Ziemlich wörtliche Übersetzung von @ feersums Lösung.
quelle
CJam, 25 Bytes
Probieren Sie es online aus
Ziemlich direkte Umsetzung der Formel in der Frage.
Erläuterung:
quelle
J, 37 Bytes
aber ich glaube es kann noch gekürzt werden.
Beispiel
Dies ist nur eine stillschweigende Version der folgenden Funktion:
quelle
(1-(%&([:+/]*<:)+/)@(+/"1@=))
ergibt 29 Bytes. 27 Wenn wir die Klammern, die die Funktion umgeben, nicht mitzählen,(1-(%&([:+/]*<:)+/)@(+/"1@=))
wie es hier üblich ist. Anmerkungen:=y
ist genau(~.=/])y
und die Compose-Konjunktion (x u&v y
=(v x) u (v y)
) war auch sehr hilfreich.C 89
Die Bewertung gilt nur für die Funktion
f
und schließt unnötige Leerzeichen aus, die nur der Übersichtlichkeit halber enthalten sind. Diemain
Funktion dient nur zu Testzwecken.Es vergleicht einfach jedes Zeichen mit jedem anderen Zeichen und dividiert dann durch die Gesamtzahl der Vergleiche.
quelle
Python 3, 56
Zählt die Paare ungleicher Elemente und dividiert dann durch die Anzahl solcher Paare.
quelle
Haskell, 83 Bytes
Ich weiß, ich bin zu spät, fand dies, hatte vergessen zu posten. Etwas unelegant, weil Haskell verlangt, dass ich ganze Zahlen in Zahlen umwandle, die Sie durcheinander teilen können.
quelle
CJam, 23 Bytes
Byteweise ist dies eine sehr geringfügige Verbesserung gegenüber Byteweise der Antwort von @ RetoKoradi , aber es wird ein ordentlicher Trick verwendet:
Die Summe der ersten n nicht-negativen ganzen Zahlen entspricht n (n - 1) / 2 , anhand derer wir den Zähler und den Nenner berechnen können, beide geteilt durch 2 , des Bruchs in der Formel der Frage berechnen können.
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
APL, 26 Bytes
Erläuterung:
≢⍵
: Ermittelt die Länge der ersten Dimension von⍵
. Da⍵
dies eine Zeichenkette sein soll, bedeutet dies die Länge der Zeichenkette.{⍴⍵}⌸⍵
: für jedes einzelne Element in⍵
erhalten Sie die Länge jeder Dimension der Liste der Vorkommen. Dies gibt die Häufigkeit an, mit der ein Element für jedes Element als1×≢⍵
Matrix auftritt .,
: Verketten Sie die beiden entlang der horizontalen Achse. Schon seit≢⍵
es sich um einen Skalar handelt und der andere Wert eine Spalte ist, erhalten wir eine2×≢⍵
Matrix, in der die erste Spalte die Häufigkeit angibt, mit der ein Element für jedes Element auftritt, und die zweite Spalte die Gesamtanzahl der Elemente.{⍵×⍵-1}
: Berechnen Sie für jede Zelle in der MatrixN(N-1)
.÷/
: Zeilen durch Unterteilung reduzieren. Dies dividiert den Wert für jeden Artikel durch den Wert für die Gesamtsumme.+/
: summiere das Ergebnis für jede Zeile.1-
: subtrahiere es von 1quelle