96 lines
1.5 KiB
Go
96 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type Instruction struct {
|
|
instr int // forward = 0, up = 1, down = 2
|
|
value int
|
|
}
|
|
|
|
func (in *Instruction) execute(x, depth int) (int, int) {
|
|
switch in.instr {
|
|
case 0: // Forward
|
|
x += in.value
|
|
case 1: // Up
|
|
depth -= in.value
|
|
case 2: // Down
|
|
depth += in.value
|
|
}
|
|
|
|
return x, depth
|
|
}
|
|
|
|
func newInstruction(str string, val int) Instruction {
|
|
instr := 0
|
|
|
|
switch str {
|
|
case "forward":
|
|
instr = 0
|
|
case "up":
|
|
instr = 1
|
|
case "down":
|
|
instr = 2
|
|
}
|
|
|
|
in := Instruction{
|
|
instr: instr,
|
|
value: val,
|
|
}
|
|
return in
|
|
}
|
|
|
|
func parseInstruction(instruction string) (Instruction, error) {
|
|
instr := strings.Split(instruction, " ")
|
|
part1 := instr[0]
|
|
part2, err := strconv.Atoi(instr[1])
|
|
if err != nil {
|
|
return Instruction{}, err
|
|
}
|
|
|
|
return newInstruction(part1, part2), nil
|
|
}
|
|
|
|
func readInput(filename string) ([]Instruction, error) {
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
instructions := make([]Instruction, 0)
|
|
|
|
for scanner.Scan() {
|
|
in, err := parseInstruction(scanner.Text())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
instructions = append(instructions, in)
|
|
}
|
|
|
|
return instructions, nil
|
|
}
|
|
|
|
func main() {
|
|
ins, err := readInput("input")
|
|
if err != nil {
|
|
fmt.Printf("%s", err.Error())
|
|
return
|
|
}
|
|
|
|
xPos := 0
|
|
depth := 0
|
|
|
|
for i := 0; i < len(ins); i++ {
|
|
xPos, depth = ins[i].execute(xPos, depth)
|
|
}
|
|
|
|
fmt.Printf("X is now: %d\nDepth is now: %d\nMultiplied is: %d", xPos, depth, (xPos * depth))
|
|
}
|