Skip to content

Commit b3753ad

Browse files
committed
[2024] Solution for Day 8
1 parent 4552a9f commit b3753ad

File tree

3 files changed

+160
-1
lines changed

3 files changed

+160
-1
lines changed

2024/day08/main.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
8+
"github.com/kfarnung/advent-of-code/2024/lib"
9+
)
10+
11+
type antenna struct {
12+
location point
13+
frequency rune
14+
}
15+
16+
type point struct {
17+
x, y int
18+
}
19+
20+
func part1(input string) int64 {
21+
antennas, width, height := parseMap(input)
22+
antinodes := make(map[point]bool)
23+
for _, antenna := range antennas {
24+
for _, antenna2 := range antennas {
25+
if antenna.location == antenna2.location || antenna.frequency != antenna2.frequency {
26+
continue
27+
}
28+
29+
delta := point{antenna2.location.x - antenna.location.x, antenna2.location.y - antenna.location.y}
30+
antinode1 := point{antenna.location.x + delta.x, antenna.location.y + delta.y}
31+
antinode2 := point{antenna.location.x - delta.x, antenna.location.y - delta.y}
32+
antinode3 := point{antenna2.location.x + delta.x, antenna2.location.y + delta.y}
33+
antinode4 := point{antenna2.location.x - delta.x, antenna2.location.y - delta.y}
34+
35+
if antinode1 != antenna2.location && antinode1.x >= 0 && antinode1.x < width && antinode1.y >= 0 && antinode1.y < height {
36+
antinodes[antinode1] = true
37+
}
38+
39+
if antinode2 != antenna2.location && antinode2.x >= 0 && antinode2.x < width && antinode2.y >= 0 && antinode2.y < height {
40+
antinodes[antinode2] = true
41+
}
42+
43+
if antinode3 != antenna.location && antinode3.x >= 0 && antinode3.x < width && antinode3.y >= 0 && antinode3.y < height {
44+
antinodes[antinode3] = true
45+
}
46+
47+
if antinode4 != antenna.location && antinode4.x >= 0 && antinode4.x < width && antinode4.y >= 0 && antinode4.y < height {
48+
antinodes[antinode4] = true
49+
}
50+
}
51+
}
52+
53+
return int64(len(antinodes))
54+
}
55+
56+
func part2(input string) int64 {
57+
antennas, rows, cols := parseMap(input)
58+
antinodes := make(map[point]bool)
59+
for _, antenna := range antennas {
60+
for _, antenna2 := range antennas {
61+
if antenna.location == antenna2.location || antenna.frequency != antenna2.frequency {
62+
continue
63+
}
64+
65+
delta := point{antenna2.location.x - antenna.location.x, antenna2.location.y - antenna.location.y}
66+
antinodeLocation := point{antenna.location.x + delta.x, antenna.location.y + delta.y}
67+
for antinodeLocation.x >= 0 && antinodeLocation.x < rows && antinodeLocation.y >= 0 && antinodeLocation.y < cols {
68+
antinodes[antinodeLocation] = true
69+
antinodeLocation = point{antinodeLocation.x + delta.x, antinodeLocation.y + delta.y}
70+
}
71+
72+
antinodeLocation = point{antenna.location.x - delta.x, antenna.location.y - delta.y}
73+
for antinodeLocation.x >= 0 && antinodeLocation.x < rows && antinodeLocation.y >= 0 && antinodeLocation.y < cols {
74+
antinodes[antinodeLocation] = true
75+
antinodeLocation = point{antinodeLocation.x - delta.x, antinodeLocation.y - delta.y}
76+
}
77+
}
78+
}
79+
80+
return int64(len(antinodes))
81+
}
82+
83+
func parseMap(input string) ([]antenna, int, int) {
84+
var antennas []antenna
85+
rows := 0
86+
lines := lib.SplitLines(input)
87+
for x, line := range lines {
88+
if len(line) == 0 {
89+
continue
90+
}
91+
92+
rows++
93+
94+
for y, frequency := range line {
95+
if frequency != '.' {
96+
antennas = append(antennas, antenna{point{x, y}, frequency})
97+
}
98+
}
99+
}
100+
return antennas, rows, len(lines[0])
101+
}
102+
103+
func main() {
104+
name := os.Args[1]
105+
content, err := lib.LoadFileContent(name)
106+
if err != nil {
107+
log.Fatal(err)
108+
}
109+
110+
fmt.Printf("Part 1: %d\n", part1(content))
111+
fmt.Printf("Part 2: %d\n", part2(content))
112+
}

2024/day08/main_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package main
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/kfarnung/advent-of-code/2024/lib"
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
var input = strings.Join([]string{
12+
"............",
13+
"........0...",
14+
".....0......",
15+
".......0....",
16+
"....0.......",
17+
"......A.....",
18+
"............",
19+
"............",
20+
"........A...",
21+
".........A..",
22+
"............",
23+
"............",
24+
"",
25+
}, "\n")
26+
27+
func TestPart1(t *testing.T) {
28+
assert.Equal(t, int64(14), part1(input))
29+
30+
inputContent, err := lib.GetInputContent()
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
35+
assert.Equal(t, int64(327), part1(inputContent))
36+
}
37+
38+
func TestPart2(t *testing.T) {
39+
assert.Equal(t, int64(34), part2(input))
40+
41+
inputContent, err := lib.GetInputContent()
42+
if err != nil {
43+
t.Fatal(err)
44+
}
45+
46+
assert.Equal(t, int64(1233), part2(inputContent))
47+
}

private

0 commit comments

Comments
 (0)