@ -0,0 +1,27 @@ | |||
Copyright (c) 2016, stephen mcquay | |||
All rights reserved. | |||
Redistribution and use in source and binary forms, with or without modification, | |||
are permitted provided that the following conditions are met: | |||
* Redistributions of source code must retain the above copyright notice, | |||
this list of conditions and the following disclaimer. | |||
* Redistributions in binary form must reproduce the above copyright notice, | |||
this list of conditions and the following disclaimer in the documentation | |||
and/or other materials provided with the distribution. | |||
* Neither the name of bandwidth nor the names of its contributors | |||
may be used to endorse or promote products derived from this software | |||
without specific prior written permission. | |||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,83 @@ | |||
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 | |||
} |
@ -0,0 +1,4 @@ | |||
# nfreq | |||
`nfreq` is a little program that answers the question "who has the most | |||
repeated letters in their name?" |