Day 08.
This commit is contained in:
parent
a16d3c95b8
commit
3cce4256cc
3
data.go
3
data.go
|
@ -24,3 +24,6 @@ var Day06Data string
|
||||||
|
|
||||||
//go:embed day_07/data.txt
|
//go:embed day_07/data.txt
|
||||||
var Day07Data string
|
var Day07Data string
|
||||||
|
|
||||||
|
//go:embed day_08/data.txt
|
||||||
|
var Day08Data string
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
....K..........................8.................z
|
||||||
|
.....n..............r...........z.................
|
||||||
|
.......................w....8.............3...E...
|
||||||
|
.....Q.....U..4.........8.........................
|
||||||
|
...............rc...w........i....................
|
||||||
|
...........K.........i..2.........................
|
||||||
|
..................4.....i.........................
|
||||||
|
K.....n....................w...........z..........
|
||||||
|
..U......Q........................I...............
|
||||||
|
..........i.....I.....Q....g....................5E
|
||||||
|
..Q......................................5........
|
||||||
|
..........c............8......w...g..........5....
|
||||||
|
.............................I.O..................
|
||||||
|
.Z.............4....b.....................k.......
|
||||||
|
..n........4......r..g..6..c.............3........
|
||||||
|
....Z............c................................
|
||||||
|
...................................x..............
|
||||||
|
.......................................O..........
|
||||||
|
...............U...................E..........5...
|
||||||
|
.....f..........................OI3......k........
|
||||||
|
..m.......o......F.......R........x...............
|
||||||
|
m...........o..v6..3...............X..............
|
||||||
|
..............H6v.....F.g.....................W...
|
||||||
|
...........o....Fb....v...............E...........
|
||||||
|
...Z.............a................................
|
||||||
|
......U6.............V............................
|
||||||
|
.9.............b..............pTk.................
|
||||||
|
.......m........V.........H1....x.................
|
||||||
|
...m.................H....................MX......
|
||||||
|
............t.a............H......................
|
||||||
|
........Z...a............v.....1..T..p.W..X.......
|
||||||
|
.............................9...x.......p........
|
||||||
|
.....J.....................V..1................0..
|
||||||
|
...........r..j..........a............pT..........
|
||||||
|
.G..................J...N......f..................
|
||||||
|
...........G......T....B........W.e...........M...
|
||||||
|
..........j.............Rk.............M..........
|
||||||
|
.........q.............MB......R.F..1..P....X...f.
|
||||||
|
............................V....o...........h....
|
||||||
|
...........................................W......
|
||||||
|
......b......u............................e.......
|
||||||
|
.............................................0....
|
||||||
|
..CA....Gt..O........................7.....e....0.
|
||||||
|
C.u......A..9J..N........................h.....e..
|
||||||
|
uj....q..........N.2..................7...........
|
||||||
|
G....N.....uJ...............................0.....
|
||||||
|
.................B................P.......h.......
|
||||||
|
...C....q...........R.........P...................
|
||||||
|
.....q..tC....2.9.....B............P....f.........
|
||||||
|
...............2.................................7
|
|
@ -0,0 +1,12 @@
|
||||||
|
............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............
|
|
@ -0,0 +1,10 @@
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
....a.....
|
||||||
|
..........
|
||||||
|
.....a....
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
|
@ -0,0 +1,10 @@
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
....a.....
|
||||||
|
........a.
|
||||||
|
.....a....
|
||||||
|
..........
|
||||||
|
......A...
|
||||||
|
..........
|
||||||
|
..........
|
|
@ -0,0 +1,10 @@
|
||||||
|
T.........
|
||||||
|
...T......
|
||||||
|
.T........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
|
@ -0,0 +1,100 @@
|
||||||
|
package day_08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Point struct {
|
||||||
|
X, Y int
|
||||||
|
}
|
||||||
|
|
||||||
|
// task:https://adventofcode.com/2024/day/8
|
||||||
|
func SolveBasic(input string) int {
|
||||||
|
antennas, width, height := loadAntennas(input)
|
||||||
|
antinodes := map[Point]bool{}
|
||||||
|
|
||||||
|
for _, v := range antennas {
|
||||||
|
for i := 0; i < len(v); i++ {
|
||||||
|
for j := i + 1; j < len(v); j++ {
|
||||||
|
for _, antinode := range findAntinodes(v[i], v[j], width, height) {
|
||||||
|
antinodes[antinode] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return len(antinodes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// task:https://adventofcode.com/2024/day/8#part2
|
||||||
|
func SolveComplex(input string) int {
|
||||||
|
antennas, width, height := loadAntennas(input)
|
||||||
|
antinodes := map[Point]bool{}
|
||||||
|
|
||||||
|
for _, v := range antennas {
|
||||||
|
for i := 0; i < len(v); i++ {
|
||||||
|
for j := i + 1; j < len(v); j++ {
|
||||||
|
for _, antinode := range findAllAntinodes(v[i], v[j], width, height) {
|
||||||
|
antinodes[antinode] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return len(antinodes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func findAntinodes(A Point, B Point, width int, height int) []Point {
|
||||||
|
dx := B.X - A.X
|
||||||
|
dy := B.Y - A.Y
|
||||||
|
|
||||||
|
points := []Point{}
|
||||||
|
p := Point{
|
||||||
|
X: A.X - dx,
|
||||||
|
Y: A.Y - dy,
|
||||||
|
}
|
||||||
|
if inGrid(p, width, height) {
|
||||||
|
points = append(points, p)
|
||||||
|
}
|
||||||
|
p = Point{
|
||||||
|
X: B.X + dx,
|
||||||
|
Y: B.Y + dy,
|
||||||
|
}
|
||||||
|
if inGrid(p, width, height) {
|
||||||
|
points = append(points, p)
|
||||||
|
}
|
||||||
|
return points
|
||||||
|
}
|
||||||
|
|
||||||
|
func findAllAntinodes(A Point, B Point, width int, height int) []Point {
|
||||||
|
dx := B.X - A.X
|
||||||
|
dy := B.Y - A.Y
|
||||||
|
|
||||||
|
points := []Point{}
|
||||||
|
for inGrid(A, width, height) {
|
||||||
|
points = append(points, Point{A.X, A.Y})
|
||||||
|
A.X -= dx
|
||||||
|
A.Y -= dy
|
||||||
|
}
|
||||||
|
for inGrid(B, width, height) {
|
||||||
|
points = append(points, Point{B.X, B.Y})
|
||||||
|
B.X += dx
|
||||||
|
B.Y += dy
|
||||||
|
}
|
||||||
|
return points
|
||||||
|
}
|
||||||
|
|
||||||
|
func inGrid(p Point, width, height int) bool {
|
||||||
|
return p.X >= 0 && p.X < width && p.Y >= 0 && p.Y < height
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadAntennas(input string) (map[rune][]Point, int, int) {
|
||||||
|
results := map[rune][]Point{}
|
||||||
|
substrings := strings.Split(input, "\n")
|
||||||
|
for y, line := range substrings {
|
||||||
|
for x, char := range line {
|
||||||
|
if char != '.' {
|
||||||
|
results[char] = append(results[char], Point{x, y})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results, len(substrings[0]), len(substrings)
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package day_08_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"advent_of_code_2024/day_08"
|
||||||
|
_ "embed"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed example_data.txt
|
||||||
|
var ExampleData string
|
||||||
|
|
||||||
|
//go:embed example_data_01.txt
|
||||||
|
var ExampleData01 string
|
||||||
|
|
||||||
|
//go:embed example_data_02.txt
|
||||||
|
var ExampleData02 string
|
||||||
|
|
||||||
|
//go:embed example_data_03.txt
|
||||||
|
var ExampleData03 string
|
||||||
|
|
||||||
|
func TestBasicSolutionExample(t *testing.T) {
|
||||||
|
result := day_08.SolveBasic(ExampleData)
|
||||||
|
if result != 14 {
|
||||||
|
t.Fatalf("Expected 14 received %d", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBasicSolutionExample01(t *testing.T) {
|
||||||
|
result := day_08.SolveBasic(ExampleData01)
|
||||||
|
if result != 2 {
|
||||||
|
t.Fatalf("Expected 2 received %d", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBasicSolutionExample02(t *testing.T) {
|
||||||
|
result := day_08.SolveBasic(ExampleData02)
|
||||||
|
if result != 4 {
|
||||||
|
t.Fatalf("Expected 4 received %d", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestComplexSolutionExample03(t *testing.T) {
|
||||||
|
result := day_08.SolveComplex(ExampleData03)
|
||||||
|
if result != 9 {
|
||||||
|
t.Fatalf("Expected 9 received %d", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestComplexSolutionExample(t *testing.T) {
|
||||||
|
result := day_08.SolveComplex(ExampleData)
|
||||||
|
if result != 34 {
|
||||||
|
t.Fatalf("Expected 34 received %d", result)
|
||||||
|
}
|
||||||
|
}
|
5
main.go
5
main.go
|
@ -8,6 +8,7 @@ import (
|
||||||
"advent_of_code_2024/day_05"
|
"advent_of_code_2024/day_05"
|
||||||
"advent_of_code_2024/day_06"
|
"advent_of_code_2024/day_06"
|
||||||
"advent_of_code_2024/day_07"
|
"advent_of_code_2024/day_07"
|
||||||
|
"advent_of_code_2024/day_08"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
@ -45,6 +46,10 @@ func main() {
|
||||||
fmt.Printf("Day 07. Basic: %d\n", day_07.SolveBasic(Day07Data)) // 20665830408335
|
fmt.Printf("Day 07. Basic: %d\n", day_07.SolveBasic(Day07Data)) // 20665830408335
|
||||||
case "07-complex":
|
case "07-complex":
|
||||||
fmt.Printf("Day 07. Complex: %d\n", day_07.SolveComplex(Day07Data)) // 20665830408335
|
fmt.Printf("Day 07. Complex: %d\n", day_07.SolveComplex(Day07Data)) // 20665830408335
|
||||||
|
case "08-basic":
|
||||||
|
fmt.Printf("Day 08. Basic: %d\n", day_08.SolveBasic(Day08Data)) // 20665830408335
|
||||||
|
case "08-complex":
|
||||||
|
fmt.Printf("Day 08. Complex: %d\n", day_08.SolveComplex(Day08Data)) // 20665830408335
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue