Day 6: Part 1 and 2
This commit is contained in:
10
main.go
10
main.go
@@ -3,7 +3,7 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/thatguygriff/aoc2020/five"
|
||||
"github.com/thatguygriff/aoc2020/six"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -24,6 +24,10 @@ func main() {
|
||||
// fmt.Println(four.PartTwo())
|
||||
|
||||
// Day 5
|
||||
fmt.Println(five.PartOne())
|
||||
fmt.Println(five.PartTwo())
|
||||
// fmt.Println(five.PartOne())
|
||||
// fmt.Println(five.PartTwo())
|
||||
|
||||
// Day 6
|
||||
fmt.Println(six.PartOne())
|
||||
fmt.Println(six.PartTwo())
|
||||
}
|
||||
|
2128
six/customs.txt
Normal file
2128
six/customs.txt
Normal file
File diff suppressed because it is too large
Load Diff
105
six/day_six.go
Normal file
105
six/day_six.go
Normal file
@@ -0,0 +1,105 @@
|
||||
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)
|
||||
}
|
97
six/day_six_test.go
Normal file
97
six/day_six_test.go
Normal file
@@ -0,0 +1,97 @@
|
||||
package six
|
||||
|
||||
import "testing"
|
||||
|
||||
func Test_data_load(t *testing.T) {
|
||||
f := flight{}
|
||||
err := f.load("sample.txt")
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
if len(f.groups) != 6 {
|
||||
t.Logf("Expected 6 groups, Got %d groups", len(f.groups))
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
uQ := f.groups[0].uniqueQuestion()
|
||||
if uQ != 6 {
|
||||
t.Logf("Expected 6 questions in Group 1, Got %d questions", uQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
uQ = f.groups[1].uniqueQuestion()
|
||||
if uQ != 3 {
|
||||
t.Logf("Expected 3 questions in Group 2, Got %d questions", uQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
uQ = f.groups[2].uniqueQuestion()
|
||||
if uQ != 3 {
|
||||
t.Logf("Expected 3 questions in Group 3, Got %d questions", uQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
uQ = f.groups[3].uniqueQuestion()
|
||||
if uQ != 3 {
|
||||
t.Logf("Expected 3 questions in Group 4, Got %d questions", uQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
uQ = f.groups[4].uniqueQuestion()
|
||||
if uQ != 1 {
|
||||
t.Logf("Expected 1 questions in Group 5, Got %d questions", uQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
uQ = f.groups[5].uniqueQuestion()
|
||||
if uQ != 1 {
|
||||
t.Logf("Expected 1 questions in Group 6, Got %d groups", uQ)
|
||||
t.FailNow()
|
||||
}
|
||||
}
|
||||
|
||||
func Test_flight_consensus_questions(t *testing.T) {
|
||||
f := flight{}
|
||||
err := f.load("sample.txt")
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
if len(f.groups) != 6 {
|
||||
t.Logf("Expected 6 groups, Got %d groups", len(f.groups))
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
cQ := f.groups[1].consensusQuestions()
|
||||
if cQ != 3 {
|
||||
t.Logf("Expected 3 questions in Group 2, Got %d questions", cQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
cQ = f.groups[2].consensusQuestions()
|
||||
if cQ != 0 {
|
||||
t.Logf("Expected 0 questions in Group 3, Got %d questions", cQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
cQ = f.groups[3].consensusQuestions()
|
||||
if cQ != 1 {
|
||||
t.Logf("Expected 3 questions in Group 4, Got %d questions", cQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
cQ = f.groups[4].consensusQuestions()
|
||||
if cQ != 1 {
|
||||
t.Logf("Expected 1 questions in Group 5, Got %d questions", cQ)
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
cQ = f.groups[5].consensusQuestions()
|
||||
if cQ != 1 {
|
||||
t.Logf("Expected 1 questions in Group 6, Got %d groups", cQ)
|
||||
t.FailNow()
|
||||
}
|
||||
}
|
19
six/sample.txt
Normal file
19
six/sample.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
abcx
|
||||
abcy
|
||||
abcz
|
||||
|
||||
abc
|
||||
|
||||
a
|
||||
b
|
||||
c
|
||||
|
||||
ab
|
||||
ac
|
||||
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
|
||||
b
|
Reference in New Issue
Block a user