Kiedyś musiałem napisać funkcję, która oblicza entropię bloku danej serii symboli dla danego rozmiaru bloku i byłem zaskoczony, jak krótki był wynik. Dlatego wzywam was do kodegolfa takiej funkcji. Nie mówię wam, co na razie zrobiłem (i w jakim języku), ale zrobię to za tydzień, jeśli nikt wcześniej nie wpadnie na takie same lub lepsze pomysły.
Definicja entropii bloku:
Biorąc pod uwagę sekwencję symboli A = A_1,…, A_n i rozmiar bloku m:
- Blok o rozmiarze m jest segmentem m kolejnych elementów sekwencji symboli, tj. A_i,…, A_ (i + m-1) dla dowolnego odpowiedniego i.
- Jeśli x jest sekwencją symboli o rozmiarze m, N (x) oznacza liczbę bloków A, które są identyczne z x.
- p (x) jest prawdopodobieństwem, że blok z A jest identyczny z sekwencją symboli x o rozmiarze m, tj. p (x) = N (x) / (n − m + 1)
- Wreszcie, entropia bloku dla rozmiaru bloku m A jest średnią −log (p (x)) dla wszystkich bloków x wielkości m w A lub (co jest równoważne) sumą −p (x) · log (p (x)) na każdy x rozmiaru m występujący w A. (Możesz wybrać dowolny rozsądny logarytm).
Ograniczenia i wyjaśnienia:
- Twoja funkcja powinna przyjąć jako argument sekwencję symboli A oraz rozmiar bloku m.
- Możesz założyć, że symbole są reprezentowane jako liczby całkowite od zera lub w innym wygodnym formacie.
- Twój program powinien być w stanie przyjąć uzasadniony argument teoretycznie, a w rzeczywistości powinien być w stanie obliczyć przykładowy przypadek (patrz poniżej) na standardowym komputerze.
- Wbudowane funkcje i biblioteki są dozwolone, o ile nie wykonują dużych części procedury w jednym wywołaniu, tj. Wyodrębniają wszystkie bloki o rozmiarze m z A, licząc liczbę wystąpień danego bloku x lub obliczając entropie z sekwencji wartości p - musisz to zrobić sam.
Test:
[2, 3, 4, 1, 2, 3, 0, 0, 3, 2, 3, 0, 2, 2, 4, 4, 4, 1, 1, 1, 0, 4, 1,
2, 2, 4, 0, 1, 2, 3, 0, 2, 3, 2, 3, 2, 0, 1, 3, 4, 4, 0, 2, 1, 4, 3,
0, 2, 4, 1, 0, 4, 0, 0, 2, 2, 0, 2, 3, 0, 0, 4, 4, 2, 3, 1, 3, 1, 1,
3, 1, 3, 1, 0, 0, 2, 2, 4, 0, 3, 2, 2, 3, 0, 3, 3, 0, 0, 4, 4, 1, 0,
2, 3, 0, 0, 1, 4, 4, 3]
Pierwszymi entropiami blokowymi tej sekwencji są (dla logarytmu naturalnego):
- m = 1: 1,599
- m = 2: 3,065
- m = 3: 4,067
- m = 4: 4,412
- m = 5: 4,535
- m = 6: 4,554
entropy(probabilities(blocks(A,m))).