d5
This commit is contained in:
parent
72dc38807d
commit
db7295bcd9
3 changed files with 112 additions and 0 deletions
88
d5/d5.go
Normal file
88
d5/d5.go
Normal file
|
@ -0,0 +1,88 @@
|
|||
package d5
|
||||
|
||||
import (
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type point struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
type segment struct {
|
||||
a point
|
||||
b point
|
||||
}
|
||||
|
||||
func createSegments(lines []string) []segment {
|
||||
segments := make([]segment, len(lines))
|
||||
for i, line := range lines {
|
||||
points := strings.Split(line, " -> ")
|
||||
start := strings.Split(points[0], ",")
|
||||
end := strings.Split(points[1], ",")
|
||||
x1, _ := strconv.Atoi(start[0])
|
||||
y1, _ := strconv.Atoi(start[1])
|
||||
x2, _ := strconv.Atoi(end[0])
|
||||
y2, _ := strconv.Atoi(end[1])
|
||||
segments[i] = segment{point{x1, y1}, point{x2, y2}}
|
||||
}
|
||||
|
||||
return segments
|
||||
}
|
||||
|
||||
func generatePoints(segments []segment) []point {
|
||||
points := []point{}
|
||||
|
||||
for _, segment := range segments {
|
||||
if segment.a.x == segment.b.x {
|
||||
min := int(math.Min(float64(segment.a.y), float64(segment.b.y)))
|
||||
max := int(math.Max(float64(segment.a.y), float64(segment.b.y)))
|
||||
for i := min; i <= max; i++ {
|
||||
points = append(points, point{segment.a.x, i})
|
||||
}
|
||||
}
|
||||
|
||||
if segment.a.y == segment.b.y {
|
||||
min := int(math.Min(float64(segment.a.x), float64(segment.b.x)))
|
||||
max := int(math.Max(float64(segment.a.x), float64(segment.b.x)))
|
||||
for i := min; i <= max; i++ {
|
||||
points = append(points, point{i, segment.a.y})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return points
|
||||
}
|
||||
|
||||
func findIntersections(points []point) map[point]int {
|
||||
|
||||
intersections := map[point]int{}
|
||||
|
||||
for _, a := range points {
|
||||
intersections[a]++
|
||||
}
|
||||
|
||||
return intersections
|
||||
}
|
||||
|
||||
func countIntersections(intersections map[point]int) int {
|
||||
count := 0
|
||||
|
||||
for _, crosses := range intersections {
|
||||
if crosses > 1 {
|
||||
count++
|
||||
}
|
||||
}
|
||||
|
||||
return count
|
||||
}
|
||||
|
||||
func D5(input string) int {
|
||||
lines := strings.Split(strings.TrimSpace(input), "\n")
|
||||
segments := createSegments(lines)
|
||||
points := generatePoints(segments)
|
||||
intersections := findIntersections(points)
|
||||
return countIntersections(intersections)
|
||||
}
|
22
d5/d5_test.go
Normal file
22
d5/d5_test.go
Normal file
|
@ -0,0 +1,22 @@
|
|||
package d5
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestD5(t *testing.T) {
|
||||
input := `0,9 -> 5,9
|
||||
8,0 -> 0,8
|
||||
9,4 -> 3,4
|
||||
2,2 -> 2,1
|
||||
7,0 -> 7,4
|
||||
6,4 -> 2,0
|
||||
0,9 -> 2,9
|
||||
3,4 -> 1,4
|
||||
0,0 -> 8,8
|
||||
5,5 -> 8,2`
|
||||
|
||||
assert.EqualValues(t, 5, D5(input))
|
||||
}
|
2
main.go
2
main.go
|
@ -11,6 +11,7 @@ import (
|
|||
"github.com/fotonmoton/aoc2021/d2"
|
||||
"github.com/fotonmoton/aoc2021/d3"
|
||||
"github.com/fotonmoton/aoc2021/d4"
|
||||
"github.com/fotonmoton/aoc2021/d5"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
@ -31,4 +32,5 @@ func main() {
|
|||
fmt.Printf("day 3 part 2: %v\n", d3.D3P2(client.Day(3)))
|
||||
fmt.Printf("day 4: %v\n", d4.D4(client.Day(4)))
|
||||
fmt.Printf("day 4 part 2: %v\n", d4.D4P2(client.Day(4)))
|
||||
fmt.Printf("day 5: %v\n", d5.D5(client.Day(5)))
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue