Skip to content

Commit 26887ea

Browse files
committed
2024.08 Part 1
1 parent 7b924c6 commit 26887ea

File tree

3 files changed

+32
-32
lines changed

3 files changed

+32
-32
lines changed

2024/8-antenna/example.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
........A...
1010
.........A..
1111
............
12-
............
12+
............

2024/8-antenna/input.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@
4747
...wS.....................................6.......
4848
................2........................8........
4949
..................................................
50-
.................x....c........................E..
50+
.................x....c........................E..

2024/8-antenna/main.go

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@ import (
55
"bufio"
66
"fmt"
77
"math"
8-
"slices"
98
)
109

1110
const nothing = '.'
1211

12+
var grid [][]byte
13+
var antennas map[byte][]position
14+
1315
func main() {
1416
file := util.FileFromArgs()
1517
scan := bufio.NewScanner(file)
1618

17-
antennas := map[byte][]position{}
19+
antennas = map[byte][]position{}
1820

19-
var grid [][]byte
2021
var row []byte
2122
for scan.Scan() {
2223
row = scan.Bytes()
@@ -33,26 +34,16 @@ func main() {
3334
grid = append(grid, row)
3435
}
3536

36-
var antinodes, points []position
37-
for k := range antennas {
38-
for i := range antennas[k] {
39-
for j := range antennas[k] {
40-
if i == j {
41-
continue
42-
}
43-
44-
points = calculateAntinodes(antennas[k][i], antennas[k][j])
45-
for p := range points {
46-
if slices.IndexFunc(antinodes, func(pp position) bool { return points[p].eq(pp) }) == -1 {
47-
antinodes = append(antinodes, points[p])
48-
}
49-
}
50-
37+
var antinodeCount int
38+
for y := range len(grid) {
39+
for x := range len(grid[0]) {
40+
if isAntinode(x, y) {
41+
antinodeCount++
5142
}
5243
}
5344
}
5445

55-
fmt.Println(len(antinodes))
46+
fmt.Println(antinodeCount)
5647
}
5748

5849
type position struct {
@@ -63,20 +54,29 @@ func (p position) eq(q position) bool {
6354
return p.X == q.X && p.Y == q.Y
6455
}
6556

66-
// calculateAntinodes will calculate all antinodes between two antennas
67-
func calculateAntinodes(c1, c2 position) []position {
68-
var positions []position
57+
func isAntinode(x, y int) bool {
58+
var diff float64
6959

70-
// sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
71-
d := math.Sqrt(float64((c1.X-c2.X)*(c1.X-c2.X) + (c1.Y-c2.Y)*(c1.Y-c2.Y)))
60+
for k := range antennas {
61+
for i := range antennas[k] {
62+
for j := range antennas[k] {
63+
if i == j {
64+
continue
65+
}
7266

73-
for r := range 20 {
74-
if d > float64(r+2*r) {
75-
continue // Circles don't touch
76-
}
67+
// Are towers on double distances?
68+
diff = math.Sqrt(float64(util.IntPow(x-antennas[k][i].X, 2)+util.IntPow(y-antennas[k][i].Y, 2))) /
69+
math.Sqrt(float64(util.IntPow(x-antennas[k][j].X, 2)+util.IntPow(y-antennas[k][j].Y, 2)))
70+
if diff == 2 || diff == .5 {
7771

78-
// TODO: calculate touch points
72+
// Test if the triangle create by these points has surface 0, this means they are all on a single line
73+
if x*(antennas[k][i].Y-antennas[k][j].Y)+antennas[k][i].X*(antennas[k][j].Y-y)+antennas[k][j].X*(y-antennas[k][i].Y) == 0 {
74+
return true
75+
}
76+
}
77+
}
78+
}
7979
}
8080

81-
return positions
81+
return false
8282
}

0 commit comments

Comments
 (0)