106 lines
1.9 KiB
Go
106 lines
1.9 KiB
Go
package six
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
type group struct {
|
|
questions []string
|
|
}
|
|
|
|
type flight struct {
|
|
groups []group
|
|
}
|
|
|
|
func (g *group) uniqueQuestion() int {
|
|
questions := map[string]bool{}
|
|
|
|
for _, answers := range g.questions {
|
|
for _, q := range answers {
|
|
if !questions[string(q)] {
|
|
questions[string(q)] = true
|
|
}
|
|
}
|
|
}
|
|
|
|
return len(questions)
|
|
}
|
|
|
|
func (g *group) consensusQuestions() int {
|
|
questions := map[string][]bool{}
|
|
|
|
for _, answers := range g.questions {
|
|
for _, q := range answers {
|
|
questions[string(q)] = append(questions[string(q)], true)
|
|
}
|
|
}
|
|
|
|
consensus := 0
|
|
for _, q := range questions {
|
|
if len(q) == len(g.questions) {
|
|
consensus++
|
|
}
|
|
}
|
|
|
|
return consensus
|
|
}
|
|
|
|
func (f *flight) load(filename string) error {
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
var g *group
|
|
for scanner.Scan() {
|
|
if scanner.Text() == "" {
|
|
// Blank line means we have moved on to the next passport
|
|
if g != nil {
|
|
f.groups = append(f.groups, *g)
|
|
g = nil
|
|
}
|
|
continue
|
|
}
|
|
|
|
if g == nil {
|
|
g = &group{}
|
|
}
|
|
|
|
g.questions = append(g.questions, scanner.Text())
|
|
}
|
|
// commit the last passport if there isn't a blank line
|
|
if g != nil {
|
|
f.groups = append(f.groups, *g)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// PartOne Find the sum of all the unique questions in all groups
|
|
func PartOne() string {
|
|
f := flight{}
|
|
f.load("six/customs.txt")
|
|
sum := 0
|
|
for _, g := range f.groups {
|
|
sum += g.uniqueQuestion()
|
|
}
|
|
|
|
return fmt.Sprintf("The sum of all the unique questions in all groups is %d", sum)
|
|
}
|
|
|
|
// PartTwo Find the sum of all the consensus questions in all groups
|
|
func PartTwo() string {
|
|
f := flight{}
|
|
f.load("six/customs.txt")
|
|
sum := 0
|
|
for _, g := range f.groups {
|
|
sum += g.consensusQuestions()
|
|
}
|
|
|
|
return fmt.Sprintf("The sum of all the consensus questions in all groups is %d", sum)
|
|
}
|