Ich musste einmal eine Funktion schreiben, die die Blockentropie einer bestimmten Symbolserie für eine bestimmte Blockgröße berechnet, und war überrascht, wie kurz das Ergebnis war. Daher fordere ich Sie heraus, eine solche Funktion zu codegolfen. Ich erzähle Ihnen nicht, was ich im Moment getan habe (und in welcher Sprache), aber ich werde es in einer Woche oder so tun, wenn niemand zuerst die gleichen oder bessere Ideen hat.
Definition der Blockentropie:
Ausgehend von einer Symbolfolge A = A_1,…, A_n und einer Blockgröße m:
- Ein Block der Größe m ist ein Segment von m aufeinanderfolgenden Elementen der Symbolsequenz, dh A_i, ..., A_ (i + m - 1) für jedes geeignete i.
- Wenn x eine Symbolfolge der Größe m ist, bezeichnet N (x) die Anzahl von Blöcken von A, die mit x identisch sind.
- p (x) ist die Wahrscheinlichkeit, dass ein Block aus A mit einer Symbolfolge x der Größe m identisch ist, dh p (x) = N (x) / (n - m + 1)
- Schließlich ist die Blockentropie für die Blockgröße m von A der Durchschnitt von –log (p (x)) über alle Blöcke x der Größe m in A oder (was äquivalent ist) die Summe von –p (x) · log (p (x)) über jedes x der Größe m in A. (Sie können einen beliebigen sinnvollen Logarithmus wählen.)
Einschränkungen und Klarstellungen:
- Ihre Funktion sollte die Symbolfolge A sowie die Blockgröße m als Argument verwenden.
- Sie können davon ausgehen, dass die Symbole als Ganzzahlen auf Nullbasis oder in einem anderen geeigneten Format dargestellt werden.
- Ihr Programm sollte in der Lage sein, theoretisch alle vernünftigen Argumente aufzunehmen, und in der Realität sollte es in der Lage sein, den Beispielfall (siehe unten) auf einem Standardcomputer zu berechnen.
- Eingebaute Funktionen und Bibliotheken sind zulässig, solange sie nicht große Teile der Prozedur in einem Aufruf ausführen, dh alle Blöcke der Größe m aus A extrahieren, die Anzahl der Vorkommen eines bestimmten Blocks x zählen oder die Entropien berechnen aus einer Folge von p-Werten - diese Dinge müssen Sie selbst tun.
Prüfung:
[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]
Die ersten Blockentropien dieser Sequenz sind (für den natürlichen Logarithmus):
- 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))).