🌅
This commit is contained in:
142
solutions/day8/day8.go
Normal file
142
solutions/day8/day8.go
Normal file
@@ -0,0 +1,142 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user