This commit is contained in:
2024-12-08 16:56:51 +01:00
parent 0de2729b53
commit 295e4fd031
5 changed files with 192 additions and 0 deletions

50
day8/data.txt Normal file
View File

@ -0,0 +1,50 @@
.....wV....q.....................................n
.......w......q.h.....Vn.........................D
............w.S..G.....................DT.........
......S........h......e..T.....y......D...........
......m.......Ae.......T........o.................
....m....S........................................
...m..........................n........8..........
.........2...G......................n.............
..2........V.......h................Q.............
............................o.....................
.Z......I..U....e...u.....G....o..................
...N..G.........................................y.
.....I............q.......h...................s...
......U........qI....o.V..Rz........8........k....
......d.Z.........................R.......8y......
.........e..............T.....l...................
.......2.........................u...R............
.....d.............................Q..............
...................v.....................s.Q....M.
........2..........4.....................8..7.k...
...........x..N..................A..........k.....
...........ZN...........v...............K.........
...d.......N.....................Ky.6.............
...........................l6.....................
....L....g.................4.......k..K.......0...
..............L...........4R................s.....
U......r..............H.4.........................
.......U.............a.......H.............u......
......xY...............l..........................
...................................6..u...........
........Y......L......l............0..............
......9..L...........A.....v..HEa........K........
..................v........6.EX.............z.....
d..Y.............m......A.........................
......................a.i......M...........z......
...................g.......................0......
...............................H.........i........
..........3................W........E...i...0.....
.................t.a....g.................5.......
.r...t...........................7.....5..........
....................................7....5........
....................g.Y...wMz.....................
9..........O....3................W.7..E..XD...1...
t..............3.x.....9..........W.M.............
...9............W.................................
Z.............x................X.i......5.........
...........3.....................................1
...................O.......s....X.................
..............r...................................
..........................O.................1.....

12
day8/example.txt Normal file
View File

@ -0,0 +1,12 @@
............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............

3
day8/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day8
go 1.22.2

126
day8/main.go Normal file
View File

@ -0,0 +1,126 @@
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
type Position struct {
X, Y int
}
func ByteToAntenna(b byte) int {
if b >= '0' && b <= '9' {
return int(b - '0')
} else if b >= 'a' && b <= 'z' {
return int(b - 'a' + 10)
} else if b >= 'A' && b <= 'Z' {
return int(b - 'A' + 36)
} else {
return -1
}
}
func IsInMap(p Position, w, h int) bool {
if p.X < 0 || p.X >= w {
return false
}
if p.Y < 0 || p.Y >= h {
return false
}
return true
}
func ComputeAntinodes(a, b Position, w, h int, first, repeats int) (antinodes []Position) {
dx := b.X - a.X
dy := b.Y - a.Y
for i := first; i <= repeats; i++ {
n1, n2 := Position{a.X - dx*i, a.Y - dy*i}, Position{b.X + dx*i, b.Y + dy*i}
n1InMap := IsInMap(n1, w, h)
n2InMap := IsInMap(n2, w, h)
if n1InMap {
antinodes = append(antinodes, n1)
}
if n2InMap {
antinodes = append(antinodes, n2)
}
if !n1InMap && !n2InMap {
break
}
}
return
}
func main() {
{
width, height, antinodes := readData("example.txt")
fmt.Println(countAntinodes(width, height, antinodes, 1, 1))
fmt.Println(countAntinodes(width, height, antinodes, 0, 999))
}
{
width, height, antinodes := readData("data.txt")
fmt.Println(countAntinodes(width, height, antinodes, 1, 1))
fmt.Println(countAntinodes(width, height, antinodes, 0, 999))
}
}
func countAntinodes(width, height int, antennas map[int][]Position, first, repeats int) (count int) {
marked := make([][]bool, height)
for y := 0; y < height; y++ {
marked[y] = make([]bool, width)
}
for _, positions := range antennas {
for i := 0; i < len(positions)-1; i++ {
for j := i + 1; j < len(positions); j++ {
for _, p := range ComputeAntinodes(positions[i], positions[j], width, height, first, repeats) {
marked[p.Y][p.X] = true
}
}
}
}
for y := 0; y < height; y++ {
for x := 0; x < len(marked[y]); x++ {
if marked[y][x] {
count++
}
}
}
return
}
func readData(fileName string) (width, height int, antennas map[int][]Position) {
fp, err := os.Open(fileName)
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(fp)
antennas = make(map[int][]Position)
y := 0
for ; scanner.Scan(); y++ {
line := strings.TrimSpace(scanner.Text())
width = len(line)
for x := 0; x < width; x++ {
antenna := ByteToAntenna(line[x])
if antenna >= 0 {
antennas[antenna] = append(antennas[antenna], Position{x, y})
}
}
}
height = y
return
}

View File

@ -8,4 +8,5 @@ use (
./day5
./day6
./day7
./day8
)