Escriba un programa o función que calcule la entropía de Shannon de una cadena dada.
Si una cadena tiene n caracteres, d caracteres distintos , x i es el i carácter distinto y P (x i ) es la probabilidad de que ese carácter ocurra en la cadena, entonces nuestra estimación de entropía de Shannon para esa cadena viene dada por:
Para la estimación en este desafío, suponemos que la probabilidad de que un carácter ocurra en una cadena es simplemente el número de veces que ocurre dividido por el número total de caracteres.
Su respuesta debe tener una precisión de al menos 3 dígitos después del período.
Casos de prueba:
"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
" ", 0.0
Entropy
cuenta bits por carácter, no total para la cadena; oh bien ...Respuestas:
Jalea,
118 bytesPruébalo en línea!
fuente
Python 3.3+, 64 bytes
Conseguido
math.log2
de solución de mbomb007 .fuente
APL,
1814 bytesEste es un tren de funciones monádicas sin nombre que acepta una cadena a la derecha y devuelve un real.
Como todas las cosas buenas de la vida, esto usa la fórmula de xnor . Obtenemos una matriz de booleanos correspondiente a las ocurrencias de cada carácter en la cadena usando
∘.=⍨
, sumamos esto a lo largo del primer eje (+/
) para obtener el número de ocurrencias de cada carácter, divide la longitud de la cadena por cada uno, luego toma la base de registro 2 (2⍟
) y suma.Pruébalo aquí
¡Guardado 4 bytes gracias a Dennis!
fuente
MATL, 17 bytes
Pruébalo en línea!
fuente
Ym
JavaScript (ES6), 67 bytes
Necesito usar
~-s.split
porque eso acepta cadenas en lugar de expresiones regulares. Como de costumbre,map
latereduce
por un byte.fuente
Perl 5, 58 bytes
Una subrutina:
Una punta de mi sombrero para xnor para la fórmula.
fuente
-F
no funciona (en fresa, de todos modos) porque incluye el$/
.MATL , 14 bytes
Pruébalo en línea!
fuente
Julia, 37 bytes
Toma una matriz de caracteres como entrada. Pruébalo en línea!
fuente
J -
181614 bytesAcortado usando la idea en el método de Dennis.
Uso
Explicación
fuente
3 : '... y'
con la misma sintaxis sería una forma válida de definirlo como una función. J afirma que se evalúa de derecha a izquierda, por lo que he refactorizado mi código como tren. No me gustan las gorras[:
pero no puedo encontrar otra forma de hacer un tren.Pyth - 17 bytes
Pruébelo en línea aquí .
fuente
Jolf, 26 bytes
Pruébalo aquí! (Tenga en cuenta que la función del conjunto de pruebas está modificada)
Explicación
fuente
Python 3.3+,
95918985 bytesSolución simple. Se requiere la versión 3.3 para usar
math.log2
.Pruébalo en línea
fuente
n*sum(s.count(c)/n
n
en una variable ahora que solo la usa una vez.Java 7, 207 bytes
Prueba detallada en línea
fuente
Factor, 98 bytes
Esta es una traducción directa de esta respuesta de Python . Agregaré una explicación durante la cena.
fuente
Raqueta, 130 bytes
:C
Traducción de mi respuesta Factor, por lo que es una traducción indirecta de la respuesta Python de Kenny Lau.
fuente
k (32 bytes)
O en
q
, la traducción no es tan corta sino más clara:fuente
Mathematica, 45 bytes
Uso
Esto devuelve resultados exactos, por lo que los aproximamos con
N
.fuente
R, 67 bytes
Explicación
Tome la entrada de stdin y divídala en una lista de caracteres. (Esta sintaxis torpe es la razón por la cual los desafíos del golf de cuerdas son tan difíciles en R ...)
Esta asignación está oculta dentro de un
length
comando, por lo que obtenemos dos asignaciones por el precio de una. Tenemosi
la lista de caracteres yl
su longitud.Ahora calculamos la entropía. R tiene una buena función
table
que devuelve los recuentos de todos los valores únicos. Para entradaThis is a test
,table(i)
devuelveEsto está indexado por caracteres, lo cual es bueno, ya que luego podemos usarlo
i
como índice para obtener el recuento de cada carácter, de esta manera:El resto del código es entonces una implementación simple de la fórmula de entropía, volteada un poco.
fuente
utf8ToInt
C #, 159 bytes
Golfizado:
Sin golf:
Prueba:
fuente
Groovy, 100 bytes
Pruebas:
fuente