L' indice Simpson est une mesure de la diversité d'une collection d'articles avec des doublons. Il s'agit simplement de la probabilité de tirer au hasard deux éléments différents lors de la cueillette sans remplacement.
Avec des n
articles dans des groupes d' n_1, ..., n_k
articles identiques, la probabilité de deux articles différents est
Par exemple, si vous avez 3 pommes, 2 bananes et 1 carotte, l'indice de diversité est
D = 1 - (6 + 2 + 0)/30 = 0.7333
Alternativement, le nombre de paires non ordonnées d'articles différents est 3*2 + 3*1 + 2*1 = 11
globalement de 15 paires, et 11/15 = 0.7333
.
Contribution:
Une chaîne de caractères A
à Z
. Ou, une liste de ces personnages. Sa longueur sera d'au moins 2. Vous ne pouvez pas supposer qu'il est trié.
Production:
L'indice de diversité Simpson des caractères de cette chaîne, c'est-à-dire la probabilité que deux caractères pris au hasard avec remplacement soient différents. Il s'agit d'un nombre compris entre 0 et 1 inclus.
Lors de la sortie d'un flottant, affichez au moins 4 chiffres, tout en terminant les sorties exactes comme 1
ou 1.0
ou 0.375
sont OK.
Vous ne pouvez pas utiliser de fonctions intégrées qui calculent spécifiquement des indices de diversité ou des mesures d'entropie. L'échantillonnage aléatoire réel est très bien, tant que vous obtenez une précision suffisante sur les cas de test.
Cas de test
AAABBC 0.73333
ACBABA 0.73333
WWW 0.0
CODE 1.0
PROGRAMMING 0.94545
Classement
Voici un classement par langue, gracieuseté de Martin Büttner .
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# 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/
au lieu de1-
. [Coup de chapeau de statisticien amateur]Réponses:
Python 2, 72
L'entrée peut être une chaîne ou une liste.
Je sais déjà que ce serait 2 octets plus court en Python 3, alors ne me conseillez pas :)
la source
<>
en position 36? Je n'ai jamais vu cette syntaxe auparavant.!=
.from __future__ import barry_as_FLUFL
l=len(s);
dedansPyth -
19131211 octetsMerci à @isaacg de m'avoir parlé de n
Utilise une approche de force brute avec
.c
une fonction de combinaisons.Essayez-le ici en ligne .
Suite de tests .
la source
.{
parn
- ils sont équivalents ici.SQL (PostgreSQL), 182 octets
En fonction des postgres.
Explication
Utilisation et test
la source
J, 26 octets
la partie cool
J'ai trouvé les comptes de chaque caractère en saisissant
</.
la chaîne contre elle-même (~
pour réflexive) puis en comptant les lettres de chaque case.la source
(#&:>@</.~)
peut être(#/.~)
et(<:*])
peut être(*<:)
. Si vous utilisez une fonction appropriée, cela donne(1-(#/.~)+/@:%&(*<:)#)
. Comme les accolades environnantes ne sont généralement pas comptées ici (départ1-(#/.~)+/@:%&(*<:)#
, le corps de la fonction), cela donne 20 octets.Python 3,
6658 octetsCela utilise la formule de comptage simple fournie dans la question, rien de trop compliqué. C'est une fonction lambda anonyme, donc pour l'utiliser, vous devez lui donner un nom.
8 octets enregistrés (!) Grâce à Sp3000.
Usage:
ou
la source
APL,
3936 octetsCela crée une monade sans nom.
Vous pouvez l' essayer en ligne !
la source
Pyth, 13 octets
Une traduction littérale de la solution de @ feersum.
la source
CJam, 25 octets
Essayez-le en ligne
Mise en œuvre assez directe de la formule de la question.
Explication:
la source
J, 37 octets
mais je crois qu'il peut encore être raccourci.
Exemple
Ceci est juste une version tacite de la fonction suivante:
la source
(1-(%&([:+/]*<:)+/)@(+/"1@=))
donne 29 octets. 27 si on ne compte pas les accolades entourant la fonction(1-(%&([:+/]*<:)+/)@(+/"1@=))
comme c'est courant ici. Notes:=y
est exactement(~.=/])y
et la conjonction de composition (x u&v y
=(v x) u (v y)
) a également été très utile.C, 89
Le score concerne
f
uniquement la fonction et exclut les espaces inutiles, qui ne sont inclus que pour plus de clarté. lamain
fonction est uniquement destinée aux tests.Il compare simplement chaque caractère avec tous les autres caractères, puis divise par le nombre total de comparaisons.
la source
Python 3, 56
Compte les paires d'éléments inégaux, puis divise par le nombre de ces paires.
la source
Haskell, 83 octets
Je sais que je suis en retard, j'ai trouvé ça, j'avais oublié de poster. Un peu inélégant avec Haskell m'obligeant à convertir des entiers en nombres que vous pouvez diviser les uns par les autres.
la source
CJam, 23 octets
Au niveau des octets, il s'agit d'une amélioration très mineure par rapport à la réponse de @ RetoKoradi , mais elle utilise une astuce intéressante :
La somme des n premiers entiers non négatifs est égale à n (n - 1) / 2 , que nous pouvons utiliser pour calculer le numérateur et le dénominateur, tous deux divisés par 2 , de la fraction dans la formule de la question.
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
APL, 26 octets
Explication:
≢⍵
: obtenir la longueur de la première dimension de⍵
. Étant donné que⍵
c'est censé être une chaîne, cela signifie la longueur de la chaîne.{⍴⍵}⌸⍵
: pour chaque élément unique dans⍵
, obtenez les longueurs de chaque dimension de la liste des occurrences. Cela donne le nombre de fois qu'un élément se produit pour chaque élément, sous forme de1×≢⍵
matrice.,
: concatène les deux le long de l'axe horizontal. Étant donné que≢⍵
est un scalaire et que l'autre valeur est une colonne, nous obtenons une2×≢⍵
matrice dans laquelle la première colonne a le nombre de fois qu'un élément se produit pour chaque élément, et la deuxième colonne a le nombre total d'éléments.{⍵×⍵-1}
: pour chaque cellule de la matrice, calculezN(N-1)
.÷/
: réduire les lignes par division. Cela divise la valeur de chaque article par la valeur du total.+/
: additionne le résultat pour chaque ligne.1-
: soustraire de 1la source