Day 8
This commit is contained in:
50
day8/data.txt
Normal file
50
day8/data.txt
Normal 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
12
day8/example.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............
|
3
day8/go.mod
Normal file
3
day8/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day8
|
||||||
|
|
||||||
|
go 1.22.2
|
126
day8/main.go
Normal file
126
day8/main.go
Normal 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
|
||||||
|
}
|
Reference in New Issue
Block a user