Skip to content

Commit 50f089d

Browse files
author
Robb Kidd
committed
in Go, but like Ruby
1 parent 922e9db commit 50f089d

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

2022/go/day06/main.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sort"
6+
"strings"
7+
8+
"github.com/robbkidd/aoc2022/tools"
9+
)
10+
11+
func main() {
12+
input := strings.Trim(tools.Read("day06"), "\n")
13+
fmt.Printf("Part 1: %v\n", scanForMarker(input, 4))
14+
fmt.Printf("Part 2: %v\n", scanForMarker(input, 14))
15+
}
16+
17+
func scanForMarker(buffer string, packetLength int) int {
18+
lookback := packetLength - 1
19+
for scan := lookback; scan < len(buffer); scan++ {
20+
if packetLength == len(uniqSorted(buffer[(scan-lookback):(scan+1)])) {
21+
return scan + 1
22+
}
23+
}
24+
return -1
25+
}
26+
27+
func uniqSorted(s string) string {
28+
seen := struct{}{}
29+
chars := make(map[rune]struct{})
30+
for _, char := range s {
31+
chars[char] = seen
32+
}
33+
var uniqRunes []rune
34+
for char := range chars {
35+
uniqRunes = append(uniqRunes, char)
36+
}
37+
sort.Slice(uniqRunes, func(i, j int) bool {
38+
return i < j
39+
})
40+
return string(uniqRunes)
41+
}

2022/go/day06/main_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestScanForMarker(t *testing.T) {
10+
testCases := []struct {
11+
input string
12+
startOfPacketMarker int
13+
startOfMessageMarker int
14+
}{
15+
{
16+
input: "mjqjpqmgbljsphdztnvjfqwrcgsmlb",
17+
startOfPacketMarker: 7,
18+
startOfMessageMarker: 19,
19+
},
20+
{
21+
input: "bvwbjplbgvbhsrlpgdmjqwftvncz",
22+
startOfPacketMarker: 5,
23+
startOfMessageMarker: 23,
24+
},
25+
{
26+
input: "nppdvjthqldpwncqszvftbrmjlhg",
27+
startOfPacketMarker: 6,
28+
startOfMessageMarker: 23,
29+
},
30+
{
31+
input: "nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg",
32+
startOfPacketMarker: 10,
33+
startOfMessageMarker: 29,
34+
},
35+
{
36+
input: "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw",
37+
startOfPacketMarker: 11,
38+
startOfMessageMarker: 26,
39+
},
40+
}
41+
for _, tC := range testCases {
42+
t.Run(tC.input, func(t *testing.T) {
43+
t.Run("packet", func(t *testing.T) {
44+
assert.Equal(t,
45+
tC.startOfPacketMarker,
46+
scanForMarker(tC.input, 4),
47+
"Failed expected packet lock",
48+
)
49+
})
50+
t.Run("message", func(t *testing.T) {
51+
assert.Equal(t,
52+
tC.startOfMessageMarker,
53+
scanForMarker(tC.input, 14),
54+
"Failed expected message lock",
55+
)
56+
})
57+
})
58+
}
59+
}
60+
61+
func TestUniqSorted(t *testing.T) {
62+
assert.Equal(t,
63+
"abc",
64+
uniqSorted("aabbccaaa"),
65+
)
66+
}

0 commit comments

Comments
 (0)