85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"AOC2022/helper"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
type Tree struct {
|
|
height int
|
|
scenicScone int
|
|
}
|
|
|
|
func main() {
|
|
args := os.Args[1:]
|
|
lines := helper.ReadTextFile(args[0])
|
|
forest := make([][]Tree, len(lines))
|
|
for i, line := range lines {
|
|
forest[i] = make([]Tree, len(line))
|
|
for j, tree := range line {
|
|
forest[i][j] = Tree{int(tree - 48), 1}
|
|
}
|
|
}
|
|
part1and2(forest)
|
|
}
|
|
|
|
func part1and2(forest [][]Tree) {
|
|
sum := 0
|
|
highestScenicScore := 0
|
|
width := len(forest[0])
|
|
for i := 1; i < len(forest)-1; i++ {
|
|
for j := 1; j < width-1; j++ {
|
|
if checkVisibleAllDir([2]int{i, j}, &forest) {
|
|
sum++
|
|
}
|
|
scenicScore := getScenicScore([2]int{i, j}, &forest)
|
|
if scenicScore > highestScenicScore {
|
|
highestScenicScore = scenicScore
|
|
}
|
|
}
|
|
}
|
|
fmt.Println(sum + len(forest)*2 + len(forest[0])*2 - 4)
|
|
fmt.Println(highestScenicScore)
|
|
}
|
|
|
|
func checkVisibleAllDir(startlocation [2]int, forest *[][]Tree) bool {
|
|
directions := [][2]int{{0, -1}, {0, +1}, {-1, 0}, {+1, 0}}
|
|
visible := false
|
|
for _, direction := range directions {
|
|
if checkVisibleDir(startlocation, direction, forest) {
|
|
visible = true
|
|
}
|
|
}
|
|
return visible
|
|
}
|
|
|
|
func checkVisibleDir(startlocation, direction [2]int, forest *[][]Tree) bool {
|
|
currentLocation := startlocation
|
|
scenicscore := 0
|
|
for currentLocation[0] > 0 && currentLocation[1] > 0 &&
|
|
currentLocation[0] < len(*forest)-1 && currentLocation[1] < len((*forest)[0])-1 {
|
|
currentLocation[0] += direction[0]
|
|
currentLocation[1] += direction[1]
|
|
scenicscore++
|
|
if getHeight(currentLocation, forest) >= getHeight(startlocation, forest) {
|
|
addScenicScore(startlocation, forest, scenicscore)
|
|
return false
|
|
}
|
|
}
|
|
addScenicScore(startlocation, forest, scenicscore)
|
|
return true
|
|
}
|
|
|
|
func getHeight(location [2]int, forest *[][]Tree) int {
|
|
return (*forest)[location[0]][location[1]].height
|
|
}
|
|
|
|
func getScenicScore(location [2]int, forest *[][]Tree) int {
|
|
return (*forest)[location[0]][location[1]].scenicScone
|
|
}
|
|
|
|
func addScenicScore(location [2]int, forest *[][]Tree, scenicScore int) {
|
|
(*forest)[location[0]][location[1]].scenicScone *= scenicScore
|
|
}
|