package main
import (
"bufio"
"log"
"os"
"strings"
)
type groupCustom map[rune]bool
func main() {
if err := realMain(); err != nil {
log.Println(err)
}
}
func realMain() error {
customs, err := parseInput()
if err != nil {
return err
}
var sum int
for _, c := range customs {
sum += len(c)
}
log.Println("Sum of customs:", sum)
return nil
}
func parseInput() ([]groupCustom, error) {
fd, err := os.Open("input.txt")
if err != nil {
return nil, err
}
defer fd.Close()
var data []string
buf := bufio.NewScanner(fd)
tmp := strings.Builder{}
for buf.Scan() {
if buf.Text() == "" {
data = append(data, tmp.String()[1:]) // trim leading space
tmp.Reset()
} else {
tmp.WriteByte(' ')
tmp.WriteString(buf.Text())
}
}
data = append(data, tmp.String()[1:])
customs := make([]groupCustom, len(data))
for i, d := range data {
customs[i] = parseCustom(d)
}
return customs, nil
}
func parseCustom(in string) groupCustom {
ppl := strings.Split(in, " ")
ret := groupCustom{}
for _, ch := range ppl[0] {
ret[ch] = true
}
for k := range ret {
for _, p := range ppl[1:] {
if !strings.ContainsRune(p, k) {
delete(ret, k)
}
}
}
return ret
}