sm
/
nfreq
1
0
Fork 0
nfreq/main.go

84 lines
1.3 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func main() {
s := bufio.NewScanner(os.Stdin)
max := 0
r := results{}
for s.Scan() {
if len(s.Text()) == 0 {
continue
}
if len(s.Text()) > max {
max = len(s.Text())
}
r = append(r, result{s.Text(), freq(s.Text())})
}
if err := s.Err(); err != nil {
panic(err)
}
sort.Sort(r)
f := fmt.Sprintf("%%%ds: %%v", max)
for _, r := range r {
fmt.Printf(f+"\n", r.name, r.h)
}
}
type letter struct {
r rune
count int
}
func (l letter) String() string {
return fmt.Sprintf("%v: %d", string(l.r), l.count)
}
type result struct {
name string
h histogram
}
type results []result
func (r results) Len() int { return len(r) }
func (r results) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
func (r results) Less(i, j int) bool {
if len(r[i].h) == 0 || len(r[j].h) == 0 {
return false
}
return r[i].h[0].count > r[j].h[0].count
}
type histogram []letter
func (n histogram) Len() int { return len(n) }
func (n histogram) Swap(i, j int) { n[i], n[j] = n[j], n[i] }
func (n histogram) Less(i, j int) bool {
return n[i].count > n[j].count
}
func freq(in string) histogram {
m := map[rune]int{}
for _, r := range in {
if r == ' ' {
continue
}
m[r]++
}
r := histogram{}
for k, v := range m {
r = append(r, letter{k, v})
}
sort.Sort(r)
return r
}