From 122b885acd5c86bfcbae152caea50c6695c4acbd Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 11 Oct 2015 17:48:34 +0200 Subject: Add entropy calculator --- flood.go | 19 +++++++++++++++---- flood_test.go | 8 ++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/flood.go b/flood.go index bb7bd9e..d5bed85 100644 --- a/flood.go +++ b/flood.go @@ -2,21 +2,32 @@ package main import ( "log" + "math" "sort" "strings" irc "github.com/fluffle/goirc/client" ) +func Entropy(s string) (e float64) { + n := make(map[rune]float64) + for _, r := range s { + n[r] += 1 / float64(len(s)) + } + for _, v := range n { + e -= v * math.Log2(v) + } + return +} + func Flood(s string) bool { - if s == "" { + if len(s) < 4 { return false } - v := strings.Fields(s) - if len(v) >= 6 { + if v := strings.Fields(s); len(v) >= 6 { return CommonWord(v) >= 2*len(v)/3 || MedianLength(v) == 1 } - return false + return Entropy(s) <= 1 } func CommonWord(v []string) int { diff --git a/flood_test.go b/flood_test.go index 699e333..3e16db4 100644 --- a/flood_test.go +++ b/flood_test.go @@ -32,6 +32,14 @@ var floodTestData = []floodTest{ Input: `a = b > 3 ? 2 : 4`, Result: true, }, + { + Input: `AAAAAAAAAAAAAAAAAAAA`, + Result: true, + }, + { + Input: `AAAAAAAAAABBBBBBBBBB`, + Result: true, + }, } func TestFlood(t *testing.T) { -- cgit v1.2.3