commit d61956e0fa58808d920a6f42a38417e7db7a3e43 Author: stephen mcquay Date: Sun Nov 6 11:14:38 2016 -0800 init diff --git a/license b/license new file mode 100644 index 0000000..f13edc8 --- /dev/null +++ b/license @@ -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. diff --git a/main.go b/main.go new file mode 100644 index 0000000..219f9d3 --- /dev/null +++ b/main.go @@ -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 +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..0a36e40 --- /dev/null +++ b/readme.md @@ -0,0 +1,4 @@ +# nfreq + +`nfreq` is a little program that answers the question "who has the most +repeated letters in their name?"