Skip to content

Commit 9f257dc

Browse files
author
Robb Kidd
committed
in Go!
1 parent 783c7f6 commit 9f257dc

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed

2022/go/day03/main.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/robbkidd/aoc2022/tools"
7+
)
8+
9+
func main() {
10+
input := parseInput(tools.Read("day03"))
11+
fmt.Printf("Part 1: %v\n", p1(input))
12+
fmt.Printf("Part 2: %v\n", p2(input))
13+
}
14+
15+
func p1(sacks []string) int {
16+
var prioritySum int
17+
for _, sack := range sacks {
18+
compartments := splitRuckSack(sack)
19+
prioritySum += priorityOf(
20+
commonItems(compartments[0], compartments[1]),
21+
)
22+
}
23+
return prioritySum
24+
}
25+
26+
func p2(sacks []string) int {
27+
var prioritySum int
28+
for i := 0; i < len(sacks); i += 3 {
29+
prioritySum += priorityOf(
30+
commonItems(
31+
commonItems(sacks[i], sacks[i+1]),
32+
sacks[i+2],
33+
),
34+
)
35+
}
36+
return prioritySum
37+
}
38+
39+
func commonItems(first, second string) string {
40+
shared := struct{}{}
41+
items := make(map[rune]struct{})
42+
for _, itemA := range first {
43+
for _, itemB := range second {
44+
if itemA == itemB {
45+
items[itemB] = shared
46+
}
47+
}
48+
}
49+
var common string
50+
for k := range items {
51+
common += string(k)
52+
}
53+
return common
54+
}
55+
56+
func splitRuckSack(sack string) []string {
57+
middle := len(sack) / 2
58+
return []string{
59+
sack[:middle],
60+
sack[middle:],
61+
}
62+
}
63+
64+
func priorityOf(item string) int {
65+
if len(item) != 1 {
66+
panic(fmt.Errorf("what is this? '%s'", item))
67+
}
68+
r := item[0]
69+
if int(r) < 96 {
70+
return int(r) - 38
71+
}
72+
return int(r) - 96
73+
}
74+
75+
func parseInput(input string) []string {
76+
return tools.Lines(input)
77+
}

2022/go/day03/main_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestExamplePart1(t *testing.T) {
10+
assert.Equal(t,
11+
157,
12+
p1(parseInput(example)))
13+
}
14+
15+
func TestExamplePart2(t *testing.T) {
16+
assert.Equal(t,
17+
70,
18+
p2(parseInput(example)))
19+
}
20+
21+
func TestSplitRucksack(t *testing.T) {
22+
assert.Equal(t,
23+
[]string{"vJrwpWtwJgWr", "hcsFMMfFFhFp"},
24+
splitRuckSack("vJrwpWtwJgWrhcsFMMfFFhFp"),
25+
)
26+
}
27+
28+
func TestCommonItem(t *testing.T) {
29+
assert.Equal(t,
30+
"p",
31+
commonItems("vJrwpWtwJgWr", "hcsFMMfFFhFp"),
32+
)
33+
34+
firstThree := parseInput(firstThreeLines)
35+
assert.Equal(t,
36+
"V",
37+
commonItems(
38+
commonItems(firstThree[0], firstThree[1]),
39+
firstThree[2],
40+
),
41+
)
42+
}
43+
44+
func TestPriorityOf(t *testing.T) {
45+
assert.Equal(t, 1, priorityOf("a"))
46+
assert.Equal(t, 26, priorityOf("z"))
47+
assert.Equal(t, 27, priorityOf("A"))
48+
assert.Equal(t, 52, priorityOf("Z"))
49+
}
50+
51+
const (
52+
example = `vJrwpWtwJgWrhcsFMMfFFhFp
53+
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
54+
PmmdzqPrVvPwwTWBwg
55+
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
56+
ttgJtRGJQctTZtZT
57+
CrZsJsPPZsGzwwsLwLmpwMDw
58+
`
59+
60+
firstThreeLines = `TZZjzzZLfZbzgzZNNJZjwCVbwMmhwCbBpCMMBCbM
61+
qRQPDqnWFQDtCCBQmQwmGGVG
62+
FPllWPDPrncZsLVrgSZTSZ
63+
`
64+
)

0 commit comments

Comments
 (0)