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 }