diff --git a/2-1/main.go b/2-1/main.go index 70a7fe5..53b29ea 100644 --- a/2-1/main.go +++ b/2-1/main.go @@ -1,7 +1,95 @@ package main -import "fmt" +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() { - fmt.Println("Hello world!") + 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)) }