Skip to content

Commit 0d5a68d

Browse files
committed
2024 day 8
1 parent e998c74 commit 0d5a68d

File tree

4 files changed

+346
-0
lines changed

4 files changed

+346
-0
lines changed

2024/day8/day8.go

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
)
8+
9+
var antennaPairs []AntennaPair
10+
var maxX, maxY int
11+
12+
func main() {
13+
filenames := []string{"testInput", "input"}
14+
for _, fileName := range filenames {
15+
fileContents, err := os.ReadFile(fileName)
16+
if err != nil {
17+
panic(err)
18+
}
19+
fmt.Println(fileName)
20+
var antennasMapByFrequency = make(map[string][][]bool)
21+
antennaPairs = make([]AntennaPair, 0)
22+
lines := strings.Split(string(fileContents), "\n")
23+
maxX = len(lines[0]) - 1
24+
maxY = len(lines) - 1
25+
for lineIndex, line := range lines {
26+
frequencies := strings.Split(line, "")
27+
for frequencyIndex, frequency := range frequencies {
28+
if frequency == "." {
29+
continue
30+
}
31+
_, ok := antennasMapByFrequency[frequency]
32+
if !ok {
33+
antennasMapByFrequency[frequency] = make([][]bool, len(lines))
34+
}
35+
if antennasMapByFrequency[frequency][lineIndex] == nil {
36+
antennasMapByFrequency[frequency][lineIndex] = make([]bool, len(line))
37+
}
38+
antennasMapByFrequency[frequency][lineIndex][frequencyIndex] = true
39+
}
40+
}
41+
for _, thisFrequencyMap := range antennasMapByFrequency {
42+
for y := 0; y < len(thisFrequencyMap); y++ {
43+
for x := 0; x < len(thisFrequencyMap[y]); x++ {
44+
if !thisFrequencyMap[y][x] {
45+
continue
46+
}
47+
for y2 := 0; y2 < len(thisFrequencyMap); y2++ {
48+
pairSearch:
49+
for x2 := 0; x2 < len(thisFrequencyMap[y2]); x2++ {
50+
if y == y2 && x == x2 {
51+
continue
52+
}
53+
for _, pair := range antennaPairs {
54+
if pair.antenna1.x == x && pair.antenna1.y == y && pair.antenna2.x == x2 && pair.antenna2.y == y2 {
55+
continue pairSearch
56+
}
57+
if pair.antenna2.x == x && pair.antenna2.y == y && pair.antenna1.x == x2 && pair.antenna1.y == y2 {
58+
continue pairSearch
59+
}
60+
}
61+
if thisFrequencyMap[y2][x2] {
62+
antennaPairs = append(antennaPairs, AntennaPair{coordinates{x, y}, coordinates{x2, y2}})
63+
}
64+
}
65+
}
66+
}
67+
}
68+
}
69+
var antiMap = make([][]bool, len(lines))
70+
for y := 0; y < len(lines); y++ {
71+
antiMap[y] = make([]bool, len(lines[y]))
72+
}
73+
for _, pair := range antennaPairs {
74+
anti := antiForPair(pair)
75+
addAntennaIfWithinBounds(anti.antenna1, &antiMap)
76+
addAntennaIfWithinBounds(anti.antenna2, &antiMap)
77+
}
78+
var total = 0
79+
for y := 0; y <= maxY; y++ {
80+
for x := 0; x <= maxX; x++ {
81+
if antiMap[y][x] {
82+
total++
83+
}
84+
}
85+
}
86+
println(total)
87+
88+
}
89+
90+
}
91+
func addAntennaIfWithinBounds(antenna coordinates, antiMap *[][]bool) {
92+
if antenna.y > maxY || antenna.y < 0 {
93+
return
94+
}
95+
if antenna.x > maxX || antenna.x < 0 {
96+
return
97+
}
98+
99+
(*antiMap)[antenna.y][antenna.x] = true
100+
}
101+
func antiForPair(pair AntennaPair) AntennaPair {
102+
xDistanceToAnti := pair.antenna2.x - pair.antenna1.x
103+
yDistanceToAnti := pair.antenna2.y - pair.antenna1.y
104+
point1 := coordinates{pair.antenna1.x + xDistanceToAnti, pair.antenna1.y + yDistanceToAnti}
105+
point2 := coordinates{pair.antenna1.x - xDistanceToAnti, pair.antenna1.y - yDistanceToAnti}
106+
point3 := coordinates{pair.antenna2.x + xDistanceToAnti, pair.antenna2.y + yDistanceToAnti}
107+
point4 := coordinates{pair.antenna2.x - xDistanceToAnti, pair.antenna2.y - yDistanceToAnti}
108+
result := AntennaPair{}
109+
if point1.x == pair.antenna2.x && point1.y == pair.antenna2.y {
110+
result.antenna1 = point2
111+
} else {
112+
result.antenna1 = point1
113+
}
114+
115+
if point3.x == pair.antenna1.x && point3.y == pair.antenna1.y {
116+
result.antenna2 = point4
117+
} else {
118+
result.antenna2 = point3
119+
}
120+
121+
return result
122+
}
123+
124+
type coordinates struct {
125+
x, y int
126+
}
127+
type AntennaPair struct {
128+
antenna1, antenna2 coordinates
129+
}

2024/day8/day8_part2.go

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"math"
6+
"os"
7+
"strings"
8+
)
9+
10+
var antennaPairs []AntennaPair
11+
var maxX, maxY int
12+
13+
func main() {
14+
filenames := []string{"testInput", "input"}
15+
for _, fileName := range filenames {
16+
fileContents, err := os.ReadFile(fileName)
17+
if err != nil {
18+
panic(err)
19+
}
20+
fmt.Println(fileName)
21+
var antennasMapByFrequency = make(map[string][][]bool)
22+
23+
antennaPairs = make([]AntennaPair, 0)
24+
lines := strings.Split(string(fileContents), "\n")
25+
maxX = len(lines[0]) - 1
26+
maxY = len(lines) - 1
27+
for lineIndex, line := range lines {
28+
frequencies := strings.Split(line, "")
29+
for frequencyIndex, frequency := range frequencies {
30+
if frequency == "." {
31+
continue
32+
}
33+
_, ok := antennasMapByFrequency[frequency]
34+
if !ok {
35+
antennasMapByFrequency[frequency] = make([][]bool, len(lines))
36+
for y := 0; y < len(lines); y++ {
37+
antennasMapByFrequency[frequency][y] = make([]bool, len(line))
38+
}
39+
}
40+
//if antennasMapByFrequency[frequency][lineIndex] == nil {
41+
// antennasMapByFrequency[frequency][lineIndex] = make([]bool, len(line))
42+
//}
43+
antennasMapByFrequency[frequency][lineIndex][frequencyIndex] = true
44+
}
45+
}
46+
for _, thisFrequencyMap := range antennasMapByFrequency {
47+
for y := 0; y < len(thisFrequencyMap); y++ {
48+
for x := 0; x < len(thisFrequencyMap[y]); x++ {
49+
if !thisFrequencyMap[y][x] {
50+
continue
51+
}
52+
for y2 := 0; y2 < len(thisFrequencyMap); y2++ {
53+
pairSearch:
54+
for x2 := 0; x2 < len(thisFrequencyMap[y2]); x2++ {
55+
if y == y2 && x == x2 {
56+
continue
57+
}
58+
for _, pair := range antennaPairs {
59+
if pair.antenna1.x == x && pair.antenna1.y == y && pair.antenna2.x == x2 && pair.antenna2.y == y2 {
60+
continue pairSearch
61+
}
62+
if pair.antenna2.x == x && pair.antenna2.y == y && pair.antenna1.x == x2 && pair.antenna1.y == y2 {
63+
continue pairSearch
64+
}
65+
}
66+
if thisFrequencyMap[y2][x2] {
67+
antennaPairs = append(antennaPairs, AntennaPair{coordinates{x, y}, coordinates{x2, y2}})
68+
}
69+
}
70+
}
71+
}
72+
}
73+
}
74+
var antiMap = make([][]bool, len(lines))
75+
for y := 0; y < len(lines); y++ {
76+
antiMap[y] = make([]bool, len(lines[y]))
77+
}
78+
for _, pair := range antennaPairs {
79+
antis := antiForPair(pair)
80+
for _, anti := range antis {
81+
addAntennaIfWithinBounds(anti, &antiMap)
82+
}
83+
84+
}
85+
var total = 0
86+
for y := 0; y <= maxY; y++ {
87+
for x := 0; x <= maxX; x++ {
88+
if antiMap[y][x] {
89+
total++
90+
}
91+
}
92+
}
93+
94+
//debug
95+
for y := 0; y <= maxY; y++ {
96+
print("\n")
97+
for x := 0; x <= maxX; x++ {
98+
if antiMap[y][x] {
99+
print("#")
100+
continue
101+
}
102+
var freqFound bool
103+
for key, thisFrequencyMap := range antennasMapByFrequency {
104+
if thisFrequencyMap[y][x] {
105+
print(key)
106+
freqFound = true
107+
break
108+
}
109+
}
110+
if !freqFound {
111+
print(".")
112+
}
113+
}
114+
}
115+
print("\n")
116+
println(total)
117+
118+
}
119+
120+
}
121+
func addAntennaIfWithinBounds(antenna coordinates, antiMap *[][]bool) {
122+
if antenna.y > maxY || antenna.y < 0 {
123+
return
124+
}
125+
if antenna.x > maxX || antenna.x < 0 {
126+
return
127+
}
128+
129+
(*antiMap)[antenna.y][antenna.x] = true
130+
}
131+
func antiForPair(pair AntennaPair) []coordinates {
132+
//y=a+bx
133+
b := float64(pair.antenna2.y-pair.antenna1.y) / float64(pair.antenna2.x-pair.antenna1.x)
134+
a := float64(pair.antenna1.y) - b*float64(pair.antenna1.x)
135+
result := make([]coordinates, 0)
136+
for x := 0; x <= maxX; x++ {
137+
//Not rounding the y will produce a wrong answer due to float math
138+
//Not sure how this rounding point is supposed to be picked, but 10 digits seemed to work
139+
var y = math.Round((a+b*float64(x))*10000000000) / 10000000000
140+
if y != float64(int(y)) {
141+
continue
142+
}
143+
if int(y) <= maxY && int(y) >= 0 {
144+
result = append(result, coordinates{x, int(y)})
145+
}
146+
}
147+
return result
148+
}
149+
150+
type coordinates struct {
151+
x, y int
152+
}
153+
type AntennaPair struct {
154+
antenna1, antenna2 coordinates
155+
}

2024/day8/input

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
............s...............1.....................
2+
......................E......3.....S..............
3+
.......................3.....S....................
4+
...e........T.t.......S.1...........I.............
5+
..................B..................I.....O......
6+
g.......z........i39......B..I....................
7+
.......s....S.......3......................i..I...
8+
....e.............2..........B....................
9+
.......tC...z.......g......1......................
10+
.E......s....R....................................
11+
..G...t..........2................................
12+
.........K...C.......2............................
13+
....T..e...........5...C..........................
14+
...T................................O...o.........
15+
...............................g..............o...
16+
.........z...................g......i............o
17+
...9.E............H...........Y.......O...........
18+
..........R..H...............7.O..................
19+
...........H.............v......7........B........
20+
..9.Q.......................W......1........Y.....
21+
.........................z.7.................Y....
22+
.....Q................................v...........
23+
....K.......E.....R...............2..........o....
24+
.n............H......v...........................Y
25+
.G.y..........................Q...................
26+
......G....A5.....................h...............
27+
..........D...5.w...9.............................
28+
......n....5...L..................................
29+
............................v.....................
30+
............L...0t..........7.....................
31+
..n....k............y....................W........
32+
..k..........0.........................W..........
33+
...n.......R..L..a........................W.......
34+
.........................................h........
35+
..0..L........c...b...............................
36+
.....................8.y..........................
37+
.......w.................6.............h.......N..
38+
..........y..4....................................
39+
...0....8...k.....Z........r......................
40+
..............a...8Z.........G......4.............
41+
........4..b.q.....................K..............
42+
.q...........kZ.K......b..D.........d.............
43+
.8.....................D................r.........
44+
.....w.........a...............d........A.........
45+
................................d.A.hV............
46+
................c..........D.....V....r...........
47+
.......Z......6.....l........................A.d..
48+
...................l..6..c....b......r...........N
49+
......a....4........q..l..V..c................N...
50+
l.....w...........q..6............V...............

2024/day8/testInput

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
............
2+
........0...
3+
.....0......
4+
.......0....
5+
....0.......
6+
......A.....
7+
............
8+
............
9+
........A...
10+
.........A..
11+
............
12+
............

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy