Napisz program lub funkcję, która oszacuje entropię Shannona danego ciągu.
Jeśli łańcuch ma n znaków, d różnych znaków, x i jest i- tym odrębnym znakiem, a P (x i ) jest prawdopodobieństwem wystąpienia tego znaku w ciągu, wówczas naszą ocenę entropii Shannona dla tego łańcucha podaje:
Do oszacowania w tym wyzwaniu zakładamy, że prawdopodobieństwo wystąpienia znaku w ciągu jest po prostu liczbą jego wystąpienia podzieloną przez całkowitą liczbę znaków.
Twoja odpowiedź musi zawierać co najmniej 3 cyfry po upływie tego okresu.
Przypadki testowe:
"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
" ", 0.0
Entropy
zlicza bity na znak, nie całkowite dla łańcucha; no cóż ...Odpowiedzi:
Galaretka,
118 bajtówWypróbuj online!
źródło
Python 3.3+, 64 bajty
Dostałem
math.log2
z rozwiązania mbomb007 .źródło
APL,
1814 bajtówJest to nienazwany, monadyczny ciąg funkcji, który przyjmuje ciąg po prawej stronie i zwraca wartość rzeczywistą.
Podobnie jak wszystkie dobre rzeczy w życiu, wykorzystuje on formułę xnor . Otrzymujemy macierz booleanów odpowiadających wystąpieniom każdego znaku w ciągu używającym
∘.=⍨
, zsumuj to wzdłuż pierwszej osi (+/
), aby uzyskać liczbę wystąpień każdego znaku, podziel długość łańcucha przez każdy, a następnie weź podstawę logarytmu 2 (2⍟
) i suma.Wypróbuj tutaj
Zaoszczędź 4 bajty dzięki Dennisowi!
źródło
MATL, 17 bajtów
Wypróbuj online!
źródło
Ym
JavaScript (ES6), 67 bajtów
Muszę użyć,
~-s.split
ponieważ akceptuje ciągi zamiast wyrażeń regularnych. Jak zwyklemap
bijereduce
bajt.źródło
Perl 5, 58 bajtów
Podprogram:
Czubek mojego kapelusza dla Xnora dla formuły.
źródło
-F
nie działa (w każdym razie Strawberry), ponieważ zawiera$/
.MATL , 14 bajtów
Wypróbuj online!
źródło
Julia, 37 bajtów
Bierze tablicę znaków jako dane wejściowe. Wypróbuj online!
źródło
J -
181614 bajtówSkrócony przy użyciu pomysłu w metodzie Dennisa.
Stosowanie
Wyjaśnienie
źródło
3 : '... y'
tej samej składni byłby prawidłowy sposób zdefiniowania go jako funkcji. J stwierdza, że ocenia od prawej do lewej, więc zreorganizowałem kod jako pociąg. Nie lubię czapek,[:
ale nie mogę znaleźć innego sposobu na pociąg.Pyth - 17 bajtów
Wypróbuj online tutaj .
źródło
Jolf, 26 bajtów
Wypróbuj tutaj! (Uwaga: funkcja zestawu testów jest błędna).
Wyjaśnienie
źródło
Python 3.3+,
95918985 bajtówProste rozwiązanie. Wymagana jest wersja 3.3
math.log2
.Wypróbuj online
źródło
n*sum(s.count(c)/n
n
zmiennej, ponieważ używasz jej tylko raz.Java 7, 207 bajtów
Szczegółowa próba online
źródło
Współczynnik, 98 bajtów
To jest bezpośrednie tłumaczenie tej odpowiedzi w języku Python . Dodam wyjaśnienie przy obiedzie.
źródło
Rakieta, 130 bajtów
:do
Tłumaczenie mojej odpowiedzi Factor, więc jest to pośrednie tłumaczenie odpowiedzi Pythona Kenny'ego Lau.
źródło
k (32 bajty)
Albo w
q
, tłumaczenie nie jest wcale takie krótkie, ale jaśniejsze:źródło
Mathematica, 45 bajtów
Stosowanie
To zwraca dokładne wyniki, więc przybliżamy je
N
.źródło
R, 67 bajtów
Wyjaśnienie
Pobierz dane wejściowe ze standardowego wejścia i podziel je na listę znaków. (Ta niezdarna składnia jest powodem, dla którego wyzwania w golfie strunowym są tak trudne w R ...)
To zadanie jest ukryte w
length
poleceniu, więc dostajemy dwa zadania w cenie jednego. Mamyi
listę znaków il
ich długość.Teraz obliczamy entropię. R ma ładną funkcję,
table
która zwraca liczbę wszystkich unikalnych wartości. Dla wejściowychThis is a test
,table(i)
zwrotówJest to indeksowane przez znaki, co jest miłe, ponieważ możemy następnie użyć
i
jako indeksu, aby uzyskać liczbę każdego znaku, tak:Reszta kodu jest więc prostą implementacją formuły entropii, nieco odwróconą.
źródło
utf8ToInt
C #, 159 bajtów
Gra w golfa:
Nie golfowany:
Test:
źródło
Groovy, 100 bajtów
Testy:
źródło