Escreva um programa ou função que calcule a entropia de Shannon de uma determinada string.
Se uma string possui n caracteres, d caracteres distintos , x i é o i- ésimo caractere distinto e P (x i ) é a probabilidade desse caractere ocorrer na string, nossa estimativa de entropia de Shannon para essa string é dada por:
Para a estimativa deste desafio, assumimos que a probabilidade de um caractere ocorrer em uma string é simplesmente o número de vezes que ocorre dividido pelo número total de caracteres.
Sua resposta deve ser precisa com pelo menos três dígitos após o período.
Casos de teste:
"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
" ", 0.0
Entropy
conta bits por caractere, não total para a string; oh bem ...Respostas:
Geléia,
118 bytesExperimente online!
fonte
Python 3.3 ou superior, 64 bytes
Obtido da solução
math.log2
de mbomb007 .fonte
APL,
1814 bytesEste é um trem de função monádico e sem nome que aceita uma string à direita e retorna um real.
Como todas as coisas boas da vida, isso usa a fórmula do xnor . Nós obtemos uma matriz de booleanos correspondentes às ocorrências de cada caractere na string usando
∘.=⍨
, soma isso ao longo do primeiro eixo (+/
) para obter o número de ocorrências de cada caractere, dividimos o comprimento da string por cada um e, em seguida, assumimos a base de log 2 (2⍟
) e soma.Experimente aqui
Economizou 4 bytes graças a Dennis!
fonte
MATL, 17 bytes
Experimente online!
fonte
Ym
JavaScript (ES6), 67 bytes
Eu preciso usar
~-s.split
porque isso aceita seqüências de caracteres em vez de regexps. Como sempre,map
superareduce
um byte.fonte
Perl 5, 58 bytes
Uma sub-rotina:
Uma dica do meu chapéu para xnor para a fórmula.
fonte
-F
não funciona (no Strawberry, de qualquer maneira) porque inclui o$/
.MATL , 14 bytes
Experimente online!
fonte
Julia, 37 bytes
Toma uma matriz de caracteres como entrada. Experimente online!
fonte
J -
181614 bytesEncurtado usando a idéia no método de Dennis.
Uso
Explicação
fonte
3 : '... y'
a mesma sintaxe seria uma maneira válida de defini-lo como uma função. J afirma que é avaliado da direita para a esquerda, então refatorei meu código como um trem. Não gosto de bonés,[:
mas não encontro outra maneira de fazer um trem.Pitão - 17 bytes
Experimente online aqui .
fonte
Jolf, 26 bytes
Experimente aqui!(Observe que a função da suíte de testes é acionada.)
Explicação
fonte
Python 3.3 ou superior,
95918985 bytesSolução simples. É necessário usar a versão 3.3
math.log2
.Experimente online
fonte
n*sum(s.count(c)/n
n
uma variável agora que a usa apenas uma vez.Java 7, 207 bytes
Teste detalhado online
fonte
Fator, 98 bytes
Esta é uma tradução direta desta resposta em Python . Vou adicionar uma explicação durante o jantar.
fonte
Raquete, 130 bytes
: c
Tradução da minha resposta ao fator, por isso é uma tradução indireta da resposta em Python de Kenny Lau.
fonte
k (32 bytes)
Ou então
q
, a tradução não é tão curta, mas mais clara:fonte
Mathematica, 45 bytes
Uso
Como retorna resultados exatos, aproximamos-os com
N
.fonte
R, 67 bytes
Explicação
Pegue a entrada do stdin e divida-a em uma lista de caracteres. (Essa sintaxe desajeitada é a razão pela qual os desafios do golfe com cordas são tão difíceis em R ...)
Essa atribuição está oculta dentro de um
length
comando, portanto, temos duas atribuições pelo preço de um. Temosi
a lista de caracteres el
seu comprimento.Agora calculamos a entropia. R tem uma função interessante
table
que retorna as contagens de todos os valores exclusivos. Para entradaThis is a test
,table(i)
retornaIsso é indexado por caracteres, o que é bom, pois podemos usar
i
como índice para obter a contagem de cada caractere, assim:O restante do código é, então, uma implementação simples da fórmula de entropia, revertida um pouco.
fonte
utf8ToInt
C #, 159 bytes
Golfe:
Ungolfed:
Teste:
fonte
Groovy, 100 bytes
Testes:
fonte