2025 Day 9 Complete!
This commit is contained in:
109
2025/day09/main.go
Normal file
109
2025/day09/main.go
Normal file
@@ -0,0 +1,109 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
func main() {
|
||||
inp := h.StdinToStringSlice()
|
||||
part1(inp)
|
||||
fmt.Println()
|
||||
part2(inp)
|
||||
}
|
||||
|
||||
func part1(inp []string) {
|
||||
c := parse(inp)
|
||||
var largest int
|
||||
for i := range c {
|
||||
for j := range c[i:] {
|
||||
a := c[i].AreaTo(c[j])
|
||||
if a > largest {
|
||||
largest = a
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println("# Part 1")
|
||||
fmt.Println(largest)
|
||||
}
|
||||
|
||||
func part2(inp []string) {
|
||||
c := parse(inp)
|
||||
var areas []Area
|
||||
for i := range c {
|
||||
for j := i + 1; j < len(c); j++ {
|
||||
areas = append(areas, Area{p1: c[i], p2: c[j], area: c[i].AreaTo(c[j])})
|
||||
}
|
||||
}
|
||||
sort.Slice(areas, func(a, b int) bool { return areas[a].area > areas[b].area })
|
||||
|
||||
var edges []h.Coordinate
|
||||
for i := range c {
|
||||
var t, n h.Coordinate
|
||||
t = c[i]
|
||||
if i < len(c)-1 {
|
||||
n = c[i+1]
|
||||
} else if i == len(c)-1 {
|
||||
n = c[0]
|
||||
}
|
||||
edges = append(edges, getEdges(t, n)...)
|
||||
}
|
||||
|
||||
var j int
|
||||
h.PrintProgress(j, len(areas))
|
||||
for j = 0; j < len(areas); j++ {
|
||||
h.ClearProgress()
|
||||
h.PrintProgress(j, len(areas))
|
||||
var nope bool
|
||||
for _, e := range edges {
|
||||
if pointIn(e, areas[j]) {
|
||||
nope = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if nope {
|
||||
continue
|
||||
}
|
||||
break
|
||||
}
|
||||
fmt.Println("# Part 2")
|
||||
fmt.Println(areas[j].area)
|
||||
}
|
||||
|
||||
func getEdges(c1, c2 h.Coordinate) []h.Coordinate {
|
||||
var ret []h.Coordinate
|
||||
if c1.X == c2.X {
|
||||
for y := h.Min(c1.Y, c2.Y); y <= h.Max(c1.Y, c2.Y); y++ {
|
||||
ret = append(ret, h.Coordinate{X: c1.X, Y: y})
|
||||
}
|
||||
return ret
|
||||
}
|
||||
for x := h.Min(c1.X, c2.X); x <= h.Max(c1.X, c2.X); x++ {
|
||||
ret = append(ret, h.Coordinate{X: x, Y: c1.Y})
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func parse(inp []string) []h.Coordinate {
|
||||
var allCoords []h.Coordinate
|
||||
for i := range inp {
|
||||
c := h.Coordinate{}
|
||||
fmt.Sscanf(inp[i], "%d,%d", &c.X, &c.Y)
|
||||
allCoords = append(allCoords, c)
|
||||
}
|
||||
return allCoords
|
||||
}
|
||||
|
||||
type Area struct {
|
||||
p1, p2 h.Coordinate
|
||||
area int
|
||||
}
|
||||
|
||||
// pointIn returns true if 't' is within the rectangle made
|
||||
// by Area
|
||||
func pointIn(t h.Coordinate, a Area) bool {
|
||||
return t.X < h.Max(a.p1.X, a.p2.X) && t.X > h.Min(a.p1.X, a.p2.X) &&
|
||||
t.Y < h.Max(a.p1.Y, a.p2.Y) && t.Y > h.Min(a.p1.Y, a.p2.Y)
|
||||
}
|
||||
Reference in New Issue
Block a user