Schreiben Sie ein Programm oder eine Funktion, die die Shannon-Entropie einer bestimmten Zeichenfolge schätzt.
Wenn eine Zeichenkette n Zeichen und d verschiedene Zeichen hat, x i das i- te verschiedene Zeichen ist und P (x i ) die Wahrscheinlichkeit ist, dass dieses Zeichen in der Zeichenkette vorkommt, dann ist unsere Shannon-Entropieschätzung für diese Zeichenkette gegeben durch:
Für die Schätzung in dieser Herausforderung nehmen wir an, dass die Wahrscheinlichkeit, dass ein Zeichen in einer Zeichenfolge vorkommt, einfach die Häufigkeit des Auftretens dividiert durch die Gesamtzahl der Zeichen ist.
Ihre Antwort muss nach dem Zeitraum auf mindestens 3 Stellen genau sein.
Testfälle:
"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
" ", 0.0
Entropy
Bits pro Zeichen, nicht die Gesamtzahl für die Zeichenfolge.Antworten:
Jelly,
118 BytesProbieren Sie es online!
quelle
Python 3.3+, 64 Bytes
Erhielt
math.log2
von mbomb007-Lösung .quelle
APL,
1814 BytesDies ist ein unbenannter, monadischer Funktionszug, der eine Zeichenfolge auf der rechten Seite akzeptiert und eine reelle zurückgibt.
Wie alle guten Dinge im Leben wird auch hier die Formel von xnor verwendet . Wir erhalten eine Matrix von Booleschen Werten, die den Vorkommen jedes Zeichens in der Zeichenfolge entsprechen. Addieren Sie diese Werte
∘.=⍨
entlang der ersten Achse (+/
), um die Anzahl der Vorkommen jedes Zeichens zu erhalten, dividieren Sie die Länge der Zeichenfolge durch jedes und nehmen Sie dann die Protokollbasis 2 (2⍟
) und Summe.Probieren Sie es hier aus
4 Bytes gespart dank Dennis!
quelle
MATL, 17 Bytes
Probieren Sie es online!
quelle
Ym
JavaScript (ES6), 67 Byte
Ich muss verwenden,
~-s.split
weil das Zeichenfolgen statt regulärer Ausdrücke akzeptiert. Wie üblich,map
schlägtreduce
byteweise.quelle
Perl 5, 58 Bytes
Ein Unterprogramm:
Ein Tipp von meinem Hut zu xnor für die Formel.
quelle
-F
funktioniert nicht (in Strawberry jedenfalls), weil es das enthält$/
.MATL , 14 Bytes
Probieren Sie es online!
quelle
Julia, 37 Bytes
Nimmt ein Zeichenarray als Eingabe. Probieren Sie es online!
quelle
J -
181614 BytesVerkürzt mit der Idee in Dennis 'Methode.
Verwendung
Erläuterung
quelle
3 : '... y'
derselben Syntax wäre eine gültige Methode, um es als Funktion zu definieren. J gibt an, dass es von rechts nach links ausgewertet wird, sodass ich meinen Code als Zug überarbeitet habe. Ich mag keine Mützen,[:
aber ich kann keinen anderen Weg finden, um einen Zug zu bauen.Pyth - 17 Bytes
Probieren Sie es hier online aus .
quelle
Jolf, 26 Bytes
Probieren Sie es hier aus! (Beachten Sie, dass die Funktion der Testsuite eingeschränkt ist.)
Erläuterung
quelle
Python 3.3+,
95918985 BytesEinfache lösung. Für die Verwendung ist Version 3.3 erforderlich
math.log2
.Probieren Sie es online aus
quelle
n*sum(s.count(c)/n
n
in einer Variablen speichern , da Sie sie nur einmal verwenden.Java 7, 207 Bytes
Ausführlicher Versuch online
quelle
Faktor 98 Bytes
Dies ist eine direkte Übersetzung dieser Python-Antwort . Ich werde beim Abendessen eine Erklärung hinzufügen.
quelle
Schläger, 130 Bytes
: c
Die Übersetzung meiner Faktor-Antwort ist also eine indirekte Übersetzung von Kenny Laus Python-Antwort.
quelle
k (32 Bytes)
Oder in
q
, die Übersetzung ist gar nicht so kurz, aber klarer:quelle
Mathematica, 45 Bytes
Verwendung
Dies gibt genaue Ergebnisse zurück, mit denen wir sie approximieren
N
.quelle
R, 67 Bytes
Erläuterung
Nehmen Sie die Eingabe von stdin und teilen Sie sie in eine Liste von Zeichen auf. (Diese klobige Syntax ist der Grund, warum Saitengolf-Herausforderungen in R ... so schwierig sind.)
Diese Zuweisung ist in einem
length
Befehl verborgen , daher erhalten wir zwei Zuweisungen zum Preis von einer. Wir habeni
die Liste der Zeichen undl
ihre Länge.Nun berechnen wir die Entropie. R hat eine nette Funktion,
table
die die Anzahl aller eindeutigen Werte zurückgibt. Bei EingabeThis is a test
wirdtable(i)
zurückgegebenDies wird durch Zeichen indiziert, was sehr schön ist, da wir dann
i
als Index verwenden können, um die Anzahl der einzelnen Zeichen zu erhalten, wie folgt:Der Rest des Codes ist dann eine einfache Implementierung der Entropieformel, die ein wenig umgedreht ist.
quelle
utf8ToInt
159 Bytes
Golf gespielt:
Ungolfed:
Prüfung:
quelle
Groovy, 100 Bytes
Tests:
quelle