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
}