Files
advent2022/solutions/day8/day8.go
2022-12-23 19:45:56 -08:00

143 lines
2.6 KiB
Go

package day8
import (
"bufio"
"fmt"
"os"
"strconv"
)
func isVisible(treeMap [][]int, x int, y int) bool {
treeHeight := treeMap[y][x]
left_test := true
for trial := 0; trial < x; trial++ {
left_test = left_test && treeMap[y][trial] < treeHeight
}
right_test := true
for trial := x + 1; trial < len(treeMap[y]); trial++ {
right_test = right_test && treeMap[y][trial] < treeHeight
}
up_test := true
for trial := 0; trial < y; trial++ {
up_test = up_test && treeMap[trial][x] < treeHeight
}
down_test := true
for trial := y + 1; trial < len(treeMap); trial++ {
down_test = down_test && treeMap[trial][x] < treeHeight
}
fmt.Println("Test for x", x, "y", y, "which has height", treeHeight, "tests are", left_test, right_test, up_test, down_test)
return (left_test || right_test || up_test || down_test)
}
func score(treeMap [][]int, x int, y int) int {
treeHeight := treeMap[y][x]
if x == 0 || y == 0 {
return 0
}
final := 1
score := 0
for trial := x - 1; trial >= 0; trial-- {
if treeMap[y][trial] >= treeHeight {
score += 1
break
}
score += 1
}
final *= score
score = 0
for trial := x + 1; trial < len(treeMap[y]); trial++ {
if treeMap[y][trial] >= treeHeight {
score += 1
break
}
score += 1
}
final *= score
score = 0
for trial := y - 1; trial >= 0; trial-- {
if treeMap[trial][x] >= treeHeight {
score += 1
break
}
score += 1
}
final *= score
score = 0
for trial := y + 1; trial < len(treeMap); trial++ {
if treeMap[trial][x] >= treeHeight {
score += 1
break
}
score += 1
}
final *= score
return final
}
func Run(filename string) {
file, err := os.Open(filename)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
treeMap := [][]int{}
for scanner.Scan() {
line := scanner.Text()
row := []int{}
for _, c := range line {
value, err := strconv.Atoi(string(c))
if err != nil {
fmt.Println("PANIC: bad character")
return
}
row = append(row, value)
}
treeMap = append(treeMap, row)
}
file.Close()
width := len(treeMap[0])
height := len(treeMap)
visibleTrees := 2*width + 2*height - 4
bestScore := 1
for y := 1; y < (height - 1); y++ {
for x := 1; x < (width - 1); x++ {
if isVisible(treeMap, x, y) {
visibleTrees += 1
//fmt.Printf("*")
} else {
//fmt.Printf("%d", treeMap[y][x])
}
current := score(treeMap, x, y)
if current > bestScore {
bestScore = current
}
}
//fmt.Println()
}
fmt.Println("There are", visibleTrees, "visible trees")
fmt.Println("Best score is", bestScore)
}