/
anagrams2.go
87 lines (75 loc) · 1.74 KB
/
anagrams2.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package anagrammer
import (
"io"
"bufio"
"fmt"
ss "github.com/Leimy/sortstring"
"os"
"regexp"
"sort"
)
var wordValidator = regexp.MustCompile("^[a-zA-Z]+$")
func AnagramsFromReader(in io.Reader) map[string][]string {
reader := bufio.NewReader(in)
var nextTok func() (string, error)
anagrams := make(map[string][]string)
nextTok = func() (string, error) {
line, notDone, err := reader.ReadLine()
if err != nil {
return "", err
}
for notDone {
var nextChunk []byte
nextChunk, notDone, err = reader.ReadLine()
if err != nil {
return "", err
}
line = append(line, nextChunk...)
}
return string(line), err
}
// nextTok = func() (string, error) {
// line, notDone, err := reader.ReadLine()
// if err != nil {
// return "", err
// } else if notDone {
// restline, err2 := nextTok() // possible problem
// if err2 != nil {
// return "", err2
// }
// return string(line) + string(restline), nil
// }
// return string(line), err
// }
line, linerr := nextTok()
for linerr == nil {
if !wordValidator.MatchString(line) { // skip non validating lines
line, linerr = nextTok()
continue
}
ss := ss.NewSortString(line)
sort.Sort(ss)
index := ss.String()
slice := anagrams[index]
if slice == nil {
slice = make([]string, 1)
}
anagrams[index] = append(slice, line)
line, linerr = nextTok()
}
return anagrams
}
func AnagramsFromFile(filename string) map[string][]string {
file, err := os.Open(filename)
if err != nil {
panic("Couldn't open file")
}
defer file.Close()
return AnagramsFromReader(file)
}
func DumpAnagrams(anagrams *map[string][]string) {
for k, v := range *anagrams {
fmt.Printf("======\n= %s\n======\n%v\n\n", k, v)
}
// fmt.Printf("%v\n", anagrams)
}