2021 - Day 5
This commit is contained in:
101
2021/5/improved.go
Normal file
101
2021/5/improved.go
Normal file
@@ -0,0 +1,101 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
aoc "AoC/2021/common"
|
||||
"bufio"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func findIntersection(diagonal bool) func (*bufio.Scanner) int {
|
||||
return func (input *bufio.Scanner) int {
|
||||
size := 1000
|
||||
diagram := make([][]int, size)
|
||||
for y := 0; y < size; y++ {
|
||||
diagram[y] = make([]int, size)
|
||||
}
|
||||
|
||||
re := regexp.MustCompile("[0-9]+")
|
||||
for input.Scan() {
|
||||
text := input.Text()
|
||||
numbers := re.FindAllString(text, -1)
|
||||
|
||||
if len(numbers) != 4 {
|
||||
panic("Did not find 4 numbers")
|
||||
}
|
||||
|
||||
x1, _ := strconv.Atoi(numbers[0])
|
||||
y1, _ := strconv.Atoi(numbers[1])
|
||||
x2, _ := strconv.Atoi(numbers[2])
|
||||
y2, _ := strconv.Atoi(numbers[3])
|
||||
|
||||
// Optionally skip lines that are not horizontal or vertical
|
||||
if !diagonal && !(x1 == x2 || y1 == y2) {
|
||||
continue
|
||||
}
|
||||
|
||||
dx := 1
|
||||
dy := 1
|
||||
length := max(max(x1, x2) - min(x1, x2) + 1, max(y1, y2) - min(y1, y2) + 1)
|
||||
|
||||
if x1 == x2 {
|
||||
dx = 0
|
||||
} else if x1 > x2 {
|
||||
dx = -dx
|
||||
}
|
||||
|
||||
if y1 == y2 {
|
||||
dy = 0
|
||||
} else if y1 > y2 {
|
||||
dy = -dy
|
||||
}
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
diagram[y1 + i*dy][x1 + i*dx]++
|
||||
}
|
||||
}
|
||||
|
||||
points := 0
|
||||
for y := 0; y < size; y++ {
|
||||
for x := 0; x < size; x++ {
|
||||
if diagram[y][x] > 1 {
|
||||
points++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return points
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
aoc := aoc.New(2021, 5)
|
||||
|
||||
aoc.Test(`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`, []int{5, 12})
|
||||
|
||||
aoc.Solution(1, findIntersection(false))
|
||||
aoc.Solution(2, findIntersection(true))
|
||||
}
|
||||
Reference in New Issue
Block a user