2021 Day 9
This commit is contained in:
parent
2d203e541e
commit
d493eb16c8
1 changed files with 110 additions and 0 deletions
110
2021/day9/main.go
Normal file
110
2021/day9/main.go
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"github.com/jdkaplan/advent-of-code/aoc"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
lines := aoc.Input().ReadLines("day9.txt")
|
||||||
|
fmt.Println(part1(lines))
|
||||||
|
fmt.Println(part2(lines))
|
||||||
|
}
|
||||||
|
|
||||||
|
func part1(lines []string) (risk int) {
|
||||||
|
g := NewGrid(lines)
|
||||||
|
for r := 0; r < g.Rows; r++ {
|
||||||
|
for c := 0; c < g.Cols; c++ {
|
||||||
|
risk += g.Risk(r, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return risk
|
||||||
|
}
|
||||||
|
|
||||||
|
func part2(lines []string) int {
|
||||||
|
g := NewGrid(lines)
|
||||||
|
var starts []RC
|
||||||
|
for r := 0; r < g.Rows; r++ {
|
||||||
|
for c := 0; c < g.Cols; c++ {
|
||||||
|
if g.Risk(r, c) != 0 {
|
||||||
|
starts = append(starts, RC{r, c})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var sizes []int
|
||||||
|
for _, rc := range starts {
|
||||||
|
sizes = append(sizes, g.Flood(rc))
|
||||||
|
}
|
||||||
|
sort.Sort(sort.Reverse(sort.IntSlice(sizes)))
|
||||||
|
return sizes[0] * sizes[1] * sizes[2]
|
||||||
|
}
|
||||||
|
|
||||||
|
type RC struct{ r, c int }
|
||||||
|
|
||||||
|
type Grid struct {
|
||||||
|
Rows int
|
||||||
|
Cols int
|
||||||
|
|
||||||
|
m map[RC]int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGrid(lines []string) Grid {
|
||||||
|
g := Grid{
|
||||||
|
m: make(map[RC]int),
|
||||||
|
Rows: len(lines),
|
||||||
|
Cols: len(lines[0]),
|
||||||
|
}
|
||||||
|
for r, row := range lines {
|
||||||
|
for c, col := range row {
|
||||||
|
g.m[RC{r, c}] = int(col - '0')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Grid) Risk(r, c int) int {
|
||||||
|
rc := RC{r, c}
|
||||||
|
v, ok := g.m[rc]
|
||||||
|
if !ok {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
for _, n := range g.Neighbors(rc) {
|
||||||
|
u, ok := g.m[n]
|
||||||
|
if ok && u <= v {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Grid) Neighbors(rc RC) []RC {
|
||||||
|
r, c := rc.r, rc.c
|
||||||
|
return []RC{
|
||||||
|
{r - 1, c},
|
||||||
|
{r, c + 1},
|
||||||
|
{r + 1, c},
|
||||||
|
{r, c - 1},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Grid) Flood(rc RC) (size int) {
|
||||||
|
queue := []RC{rc}
|
||||||
|
seen := make(map[RC]bool)
|
||||||
|
for len(queue) > 0 {
|
||||||
|
rc, queue = queue[0], queue[1:]
|
||||||
|
if seen[rc] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, n := range g.Neighbors(rc) {
|
||||||
|
if v, ok := g.m[n]; ok && v < 9 {
|
||||||
|
queue = append(queue, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
seen[rc] = true
|
||||||
|
size++
|
||||||
|
}
|
||||||
|
return size
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue