package main
import (
"bufio"
"fmt"
"log"
"os"
"strings"
)
const (
mapDown = 323
tree = '#'
)
var slopeKind = []struct {
name string
right int
down int
}{
{"r1d1", 1, 1},
{"r3d1", 3, 1},
{"r5d1", 5, 1},
{"r7d1", 7, 1},
{"r1d2", 1, 2},
}
func main() {
if err := realMain(); err != nil {
log.Println(err)
}
}
func realMain() error {
for _, s := range slopeKind {
m, err := createMap(s.right * mapDown)
if err != nil {
return err
}
log.Println(s.name, countTrees(m, s.right, s.down))
}
return nil
}
func countTrees(m []string, right, down int) int {
var (
count int
col int
)
for i := 0; i < len(m); i += down {
if m[i][col] == tree {
count++
}
col += right
}
return count
}
func createMap(mapRight int) ([]string, error) {
fd, err := os.Open("input.txt")
if err != nil {
return nil, err
}
defer fd.Close()
var ret []string
buf := bufio.NewScanner(fd)
for i := 0; buf.Scan(); i++ {
line := strings.Builder{}
for line.Len() < mapRight {
line.WriteString(buf.Text())
}
ret = append(ret, line.String())
}
if len(ret) != mapDown {
return nil, fmt.Errorf("unexpected number of lines")
}
return ret, nil
}