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) }