Écrivez un programme ou une fonction qui estime l'entropie de Shannon d'une chaîne donnée.
Si une chaîne a n caractères, d caractères distincts , x i est le i ème caractère distinct et P (x i ) est la probabilité que ce caractère se produise dans la chaîne, alors notre estimation d'entropie de Shannon pour cette chaîne est donnée par:
Pour l'estimation dans ce défi, nous supposons que la probabilité qu'un caractère apparaisse dans une chaîne est simplement le nombre de fois où il se produit divisé par le nombre total de caractères.
Votre réponse doit être précise à au moins 3 chiffres après la période.
Cas de test:
"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
" ", 0.0
Entropy
compte les bits par caractère, pas le total pour la chaîne; eh bien ...Réponses:
Gelée,
118 octetsEssayez-le en ligne!
la source
Python 3.3+, 64 octets
Vous avez
math.log2
de la solution de mbomb007 .la source
APL,
1814 octetsIl s'agit d'un train de fonctions monadique sans nom qui accepte une chaîne à droite et renvoie un réel.
Comme toutes les bonnes choses de la vie, cela utilise la formule de xnor . Nous obtenons une matrice de booléens correspondant aux occurrences de chaque caractère dans la chaîne en utilisant
∘.=⍨
, additionnons ceci le long du premier axe (+/
) pour obtenir le nombre d'occurrences de chaque caractère, divisons la longueur de la chaîne par chacun, puis prenons la base de log 2 (2⍟
) et somme.Essayez-le ici
4 octets enregistrés grâce à Dennis!
la source
MATL, 17 octets
Essayez-le en ligne!
la source
Ym
JavaScript (ES6), 67 octets
Je dois utiliser
~-s.split
car cela accepte les chaînes plutôt que les expressions régulières. Comme d'habitude,map
batreduce
d'un octet.la source
Perl 5, 58 octets
Un sous-programme:
Un petit coup de chapeau à xnor pour la formule.
la source
-F
ne fonctionne pas (dans Strawberry, de toute façon) car il inclut le$/
.MATL , 14 octets
Essayez-le en ligne!
la source
Julia, 37 octets
Prend un tableau de caractères en entrée. Essayez-le en ligne!
la source
J -
181614 octetsRaccourci en utilisant l'idée de la méthode de Dennis.
Usage
Explication
la source
3 : '... y'
avec la même syntaxe serait un moyen valide de le définir comme une fonction. J déclare qu'il évalue de droite à gauche, j'ai donc refactorisé mon code en train. Je n'aime pas les casquettes[:
mais je ne trouve pas d'autre moyen de faire un train.Pyth - 17 octets
Essayez-le en ligne ici .
la source
Jolf, 26 octets
Essayez-le ici! (Notez que la fonction de la suite de tests est borked.)
Explication
la source
Python 3.3+,
95918985 octetsSolution simple. La version 3.3 est requise pour utiliser
math.log2
.Essayez-le en ligne
la source
n*sum(s.count(c)/n
n
dans une variable maintenant que vous ne l'utilisez qu'une seule fois.Java 7, 207 octets
Essai détaillé en ligne
la source
Facteur, 98 octets
Ceci est une traduction directe de cette réponse Python . Je vais ajouter une explication au cours du dîner.
la source
Raquette, 130 octets
: c
Traduction de ma réponse Factor, c'est donc une traduction indirecte de la réponse Python de Kenny Lau.
la source
k (32 octets)
Ou bien
q
, la traduction n'est pas si courte mais plus claire:la source
Mathematica, 45 octets
Usage
Cela renvoie des résultats exacts, nous les rapprochons donc de
N
.la source
R, 67 octets
Explication
Prenez l'entrée de stdin et divisez-la en une liste de caractères. (Cette syntaxe maladroite est la raison pour laquelle les défis du golf à cordes sont si difficiles dans R ...)
Cette affectation est cachée à l'intérieur d'une
length
commande, nous obtenons donc deux affectations pour le prix d'une. Nous avonsi
, la liste des caractères etl
sa longueur.Maintenant, nous calculons l'entropie. R a une belle fonction
table
qui renvoie le nombre de toutes les valeurs uniques. Pour l'entréeThis is a test
,table(i)
renvoieCeci est indexé par caractères, ce qui est bien, car nous pouvons ensuite l'utiliser
i
comme index pour obtenir le nombre de chaque caractère, comme ceci:Le reste du code est alors une simple implémentation de la formule d'entropie, retournée un peu.
la source
utf8ToInt
C #, 159 octets
Golfé:
Non golfé:
Tester:
la source
Groovy, 100 octets
Tests:
la source