Напишите программу или функцию, которая оценивает энтропию Шеннона данной строки.
Если строка содержит n символов, d различных символов, x i - это i- й отдельный символ, а P (x i ) - вероятность того, что этот символ встречается в строке, то наша оценка энтропии Шеннона для этой строки определяется как:
Для оценки в этой задаче мы предполагаем, что вероятность появления символа в строке - это просто число его повторений, деленное на общее количество символов.
Ваш ответ должен быть точным, по крайней мере, до 3 цифр после периода.
Тестовые случаи:
"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
" ", 0.0
Entropy
считает биты на символ, а не сумму для строки; о хорошо ...Ответы:
Желе,
118 байтПопробуйте онлайн!
источник
Python 3.3+, 64 байта
Получил
math.log2
из решения mbomb007 .источник
APL,
1814 байтовЭто неназванный монадический набор функций, который принимает строку справа и возвращает реальную.
Как и все хорошее в жизни, здесь используется формула xnor . Мы получаем матрицу логических значений, соответствующих вхождениям каждого символа в строке, используя
∘.=⍨
суммирование по первой оси (+/
), чтобы получить количество вхождений каждого символа, разделить длину строки на каждое, а затем взять основание журнала 2 (2⍟
) и сумма.Попробуй здесь
Сохранено 4 байта благодаря Денису!
источник
MATL, 17 байт
Попробуйте онлайн!
источник
Ym
JavaScript (ES6), 67 байт
Мне нужно использовать,
~-s.split
потому что он принимает строки, а не регулярные выражения. Как обычно,map
бьетreduce
по байту.источник
Perl 5, 58 байт
Подпрограмма:
Кончик моей шляпы xnor для формулы.
источник
-F
не работает (во всяком случае, в Strawberry), потому что включает в себя$/
.MATL , 14 байтов
Попробуйте онлайн!
источник
Юлия, 37 байт
Принимает массив символов в качестве входных данных. Попробуйте онлайн!
источник
J -
181614 байтовСокращено с использованием идеи в методе Денниса.
использование
объяснение
источник
3 : '... y'
с тем же синтаксисом было бы правильным способом определить его как функцию. J утверждает, что он оценивается справа налево, поэтому я реорганизовал свой код как поезд. Я не люблю кепки,[:
но я не могу найти другой способ сделать поезд.Pyth - 17 байт
Попробуйте это онлайн здесь .
источник
Джольф, 26 байт
Попробуй это здесь! (Обратите внимание, что функция набора тестов не работает.)
объяснение
источник
Python 3.3+,
95918985 байтПростое решение Версия 3.3 требуется для использования
math.log2
.Попробуйте онлайн
источник
n*sum(s.count(c)/n
n
переменную сейчас, когда вы используете ее только один раз.Java 7, 207 байт
Подробная попытка онлайн
источник
Фактор, 98 байт
Это прямой перевод этого ответа Python . Я добавлю объяснение за ужином.
источник
Ракетка, 130 байт
: с
Перевод моего факторного ответа, так что это косвенный перевод ответа Кенни Лау на Python.
источник
к (32 байта)
Или
q
, в переводе не все так коротко, но яснее:источник
Mathematica, 45 байт
использование
Это возвращает точные результаты, поэтому мы приближаем их
N
.источник
R, 67 байт
объяснение
Возьмите ввод из stdin и разбейте его на список символов. (Этот неуклюжий синтаксис - вот почему проблемы с гольфом в R настолько сложны в R ...)
Это назначение скрыто внутри
length
команды, поэтому мы получаем два назначения по цене одного. У нас естьi
список символов иl
его длина.Теперь вычислим энтропию. R имеет приятную функцию,
table
которая возвращает количество всех уникальных значений. Для вводаThis is a test
,table(i)
возвращаетсяЭто индексируется символами, что хорошо, так как мы можем затем использовать его
i
в качестве индекса для подсчета каждого символа, например так:Остальная часть кода представляет собой простую реализацию формулы энтропии, которая немного изменилась.
источник
utf8ToInt
C #, 159 байт
Golfed:
Ungolfed:
Тестовое задание:
источник
Groovy, 100 байт
тесты:
источник