143 lines
2.6 KiB
Go
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)
|
|
}
|