Tulis program atau fungsi yang memperkirakan entropi Shannon dari string yang diberikan.
Jika string memiliki n karakter, d karakter berbeda , x i adalah karakter berbeda ke- i , dan P (x i ) adalah probabilitas karakter tersebut muncul dalam string, maka estimasi entropi Shannon kami untuk string tersebut diberikan oleh:
Untuk estimasi dalam tantangan ini, kita mengasumsikan bahwa probabilitas suatu karakter yang muncul dalam sebuah string hanyalah berapa kali itu terjadi dibagi dengan jumlah total karakter.
Jawaban Anda harus akurat setidaknya 3 digit setelah periode.
Kasus uji:
"This is a test.", 45.094
"00001111", 8.000
"cwmfjordbankglyphsvextquiz", 122.211
" ", 0.0
Entropy
menghitung bit per karakter, bukan total untuk string; oh well ...Jawaban:
Jelly,
118 byteCobalah online!
sumber
Python 3.3+, 64 byte
Dapatkan
math.log2
dari solusi mbomb007 .sumber
APL,
1814 byteIni adalah kereta fungsi monadik tanpa nama yang menerima string di sebelah kanan dan mengembalikan yang asli.
Seperti semua hal baik dalam hidup, ini menggunakan rumus xnor . Kami mendapatkan matriks boolean yang sesuai dengan kemunculan setiap karakter dalam string menggunakan
∘.=⍨
, jumlah ini sepanjang sumbu pertama (+/
) untuk mendapatkan jumlah kemunculan masing-masing karakter, bagi panjang string dengan masing-masing, kemudian ambil basis log 2 (2⍟
) dan jumlah.Coba di sini
Disimpan 4 byte berkat Dennis!
sumber
MATL, 17 byte
Cobalah online!
sumber
Ym
JavaScript (ES6), 67 byte
Saya perlu menggunakan
~-s.split
karena menerima string daripada regexps. Seperti biasa,map
ketukanreduce
satu byte.sumber
Perl 5, 58 byte
Subrutin:
Ujung topi saya untuk xnor untuk formula.
sumber
-F
tidak berfungsi (dalam Strawberry, lagi pula) karena termasuk$/
.MATL , 14 byte
Cobalah online!
sumber
Julia, 37 byte
Mengambil array karakter sebagai input. Cobalah online!
sumber
J -
181614 byteDipersingkat menggunakan ide dalam metode Dennis.
Pemakaian
Penjelasan
sumber
3 : '... y'
dengan sintaks yang sama akan menjadi cara yang valid untuk mendefinisikannya sebagai fungsi. J menyatakan bahwa itu mengevaluasi dari kanan ke kiri, jadi saya telah refactored kode saya sebagai kereta. Saya tidak suka topi[:
tapi saya tidak bisa menemukan cara lain untuk membuat kereta.Pyth - 17 byte
Cobalah online di sini .
sumber
Jolf, 26 byte
Coba di sini! (Perhatikan bahwa fungsi test suite borked.)
Penjelasan
sumber
Python 3.3+,
95918985 byteSolusi sederhana. Versi 3.3 diperlukan untuk digunakan
math.log2
.Cobalah online
sumber
n*sum(s.count(c)/n
n
dalam variabel sekarang karena Anda hanya menggunakannya sekali.Java 7, 207 byte
Detail coba online
sumber
Faktor, 98 byte
Ini adalah terjemahan langsung dari jawaban Python ini . Saya akan menambahkan penjelasan saat makan malam.
sumber
Racket, 130 byte
: c
Terjemahan dari jawaban Factor saya, jadi ini adalah terjemahan tidak langsung dari jawaban Python Kenny Lau.
sumber
k (32 byte)
Atau dalam
q
, terjemahannya tidak sesingkat itu tetapi lebih jelas:sumber
Mathematica, 45 byte
Pemakaian
Ini mengembalikan hasil yang tepat sehingga kami memperkirakannya dengan
N
.sumber
R, 67 byte
Penjelasan
Ambil input dari stdin dan bagi menjadi daftar karakter. (Sintaks kikuk inilah yang menyebabkan tantangan golf sangat sulit di R ...)
Tugas ini disembunyikan di dalam sebuah
length
perintah, jadi kami mendapatkan dua tugas dengan harga satu. Kami punyai
, daftar karakter, danl
panjangnya.Sekarang kita menghitung entropi. R memiliki fungsi
table
yang bagus yang mengembalikan jumlah semua nilai unik. Untuk inputThis is a test
,table(i)
kembaliIni diindeks oleh karakter, yang bagus, karena kita dapat menggunakan
i
sebagai indeks untuk mendapatkan hitungan setiap karakter, seperti:Sisa kode selanjutnya merupakan implementasi sederhana dari rumus entropi, diputar sedikit.
sumber
utf8ToInt
C #, 159 byte
Golf:
Tidak Disatukan:
Uji:
sumber
Groovy, 100 Bytes
Tes:
sumber