package main
import (
"bufio"
"log"
"os"
"strconv"
"strings"
)
type Move struct {
dir string
length int
}
func main() {
if err := myMain(); err != nil {
log.Println(err)
}
}
func myMain() error {
// parse input.txt
data, err := parseInput()
if err != nil {
return err
}
log.Println("Part1:", SolveFirst(data))
log.Println("Part2:", SolveSecond(data))
return nil
}
func SolveFirst(data []Move) int {
var depth, fwd int
for _, d := range data {
switch d.dir {
case "forward":
fwd += d.length
case "down":
depth += d.length
case "up":
depth -= d.length
default:
panic("no way!")
}
}
return depth * fwd
}
func SolveSecond(data []Move) int {
var depth, fwd, aim int
for _, d := range data {
switch d.dir {
case "forward":
fwd += d.length
depth += d.length * aim
case "down":
aim += d.length
case "up":
aim -= d.length
default:
panic("no way!")
}
}
return depth * fwd
}
func parseInput() ([]Move, error) {
fd, err := os.Open("input.txt")
if err != nil {
return nil, err
}
defer fd.Close()
buf := bufio.NewScanner(fd)
var ret []Move
for buf.Scan() {
tmp := strings.Split(buf.Text(), " ")
l, err := strconv.Atoi(tmp[1])
if err != nil {
return nil, err
}
ret = append(ret, Move{tmp[0], l})
}
return ret, nil
}