/
lengthsingle.go
59 lines (54 loc) · 1.26 KB
/
lengthsingle.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
package main
import "strings"
// LengthSingle generates:
//
// func Len1Ch(name string) bool {
// switch len(name) {
// case 2: // go, if
// switch name[0] {
// case 'g':
// return name == "go"
// ...
type LengthSingle struct{}
func (LengthSingle) Generate(p Printer, keywords []string) {
bylen := map[int][]string{}
_, maxlen := keywordBounds(keywords)
for _, keyword := range keywords {
n := len(keyword)
bylen[n] = append(bylen[n], keyword)
}
uniquech := map[int]int{}
for namelen, names := range bylen {
chi := findUniqueChar(names)
if chi < 0 {
return
}
uniquech[namelen] = chi
}
p.FuncName("Len1Ch")
p.F("func Len1Ch(name string) bool {\n")
{
p.F("switch len(name) {")
for namelen := 0; namelen < maxlen; namelen++ {
names, ok := bylen[namelen]
if !ok {
continue
}
p.F("case %d: // %s\n", namelen, strings.Join(names, ", "))
if len(names) == 1 {
p.F("return name == %q\n", names[0])
continue
}
chi := uniquech[namelen]
p.F("switch name[%d] {\n", chi)
for _, name := range names {
p.F("case %q: return name == %q\n", name[chi], name)
}
p.F("}\n")
p.F("return false\n")
}
p.F("}\n")
}
p.F("return false\n")
p.F("}\n\n")
}