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

68 lines
918 B
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 result struct {
name string
h histogram
}
type results []result
type histogram []letter
type letter struct {
r rune
count int
}
func (l letter) String() string {
return fmt.Sprintf("%v: %d", string(l.r), l.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
}