diff --git a/main.go b/main.go index 0cd1b5c..923373c 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "strings" "unsupervised.ca/aoc2021/one" + "unsupervised.ca/aoc2021/two" ) func main() { @@ -25,6 +26,8 @@ func main() { switch flagParts[1] { case "one": day = one.Init("one/input.txt") + case "two": + day = two.Init("two/input.txt") default: fmt.Printf("%q does not have a solution.\n", flagParts[1]) help() diff --git a/two/input.txt b/two/input.txt new file mode 100644 index 0000000..48f534f --- /dev/null +++ b/two/input.txt @@ -0,0 +1,1000 @@ +forward 3 +down 7 +forward 8 +down 9 +forward 3 +down 5 +down 9 +down 6 +forward 1 +forward 8 +forward 9 +forward 3 +down 7 +down 8 +up 3 +down 5 +down 8 +down 9 +forward 5 +forward 6 +down 2 +forward 1 +forward 3 +down 9 +up 6 +up 2 +down 7 +down 9 +forward 2 +down 9 +up 3 +forward 5 +up 9 +up 9 +forward 4 +down 6 +up 7 +up 8 +up 6 +up 2 +down 7 +forward 9 +down 4 +forward 2 +forward 1 +up 7 +down 2 +down 8 +down 8 +down 2 +down 7 +down 3 +up 4 +down 7 +down 1 +down 7 +down 7 +forward 8 +forward 1 +forward 5 +forward 1 +forward 9 +forward 3 +forward 5 +down 3 +forward 9 +down 4 +down 2 +forward 5 +down 4 +down 4 +down 4 +down 9 +down 6 +down 5 +forward 2 +down 2 +down 8 +down 8 +down 7 +down 2 +down 8 +down 6 +down 4 +down 7 +up 8 +up 7 +up 6 +down 4 +down 2 +up 4 +up 8 +up 4 +down 4 +down 3 +forward 7 +forward 8 +up 1 +up 1 +up 7 +forward 2 +down 2 +forward 7 +forward 7 +forward 7 +down 2 +down 2 +forward 5 +down 3 +forward 3 +down 6 +down 9 +down 4 +down 1 +forward 2 +forward 2 +down 8 +down 9 +up 3 +forward 8 +down 7 +forward 6 +forward 6 +down 9 +up 2 +up 9 +down 2 +down 8 +up 2 +forward 6 +down 5 +up 9 +forward 6 +down 3 +down 9 +forward 8 +forward 8 +forward 1 +forward 6 +down 7 +forward 3 +forward 5 +forward 6 +down 1 +down 1 +forward 3 +forward 8 +forward 8 +up 5 +down 6 +up 5 +down 1 +up 3 +down 6 +forward 1 +up 3 +up 4 +down 8 +down 2 +up 2 +forward 1 +forward 2 +forward 6 +up 2 +down 3 +up 5 +down 5 +down 7 +up 6 +up 6 +down 8 +forward 7 +forward 2 +forward 3 +up 5 +down 5 +down 6 +down 4 +forward 8 +up 1 +forward 5 +up 1 +forward 4 +forward 3 +forward 4 +down 2 +up 5 +up 4 +down 5 +forward 1 +forward 8 +down 7 +down 1 +down 7 +forward 6 +down 4 +down 6 +forward 6 +down 8 +forward 7 +down 4 +down 8 +up 7 +down 6 +down 2 +up 8 +down 7 +down 8 +down 6 +down 3 +up 1 +down 7 +forward 1 +down 3 +down 5 +down 9 +down 3 +forward 1 +forward 4 +forward 2 +down 8 +forward 7 +down 3 +down 7 +forward 7 +down 4 +down 5 +down 1 +forward 2 +down 7 +forward 3 +forward 4 +down 8 +up 6 +down 4 +up 5 +forward 5 +forward 7 +up 8 +forward 6 +up 3 +forward 9 +up 9 +down 1 +down 2 +forward 6 +down 5 +forward 6 +down 7 +forward 9 +down 2 +up 5 +down 2 +forward 3 +up 7 +forward 3 +down 4 +forward 7 +forward 8 +down 5 +up 7 +up 8 +forward 7 +down 4 +forward 9 +forward 6 +down 2 +forward 3 +up 8 +up 4 +forward 2 +forward 4 +forward 1 +down 6 +forward 1 +down 9 +forward 2 +up 5 +down 2 +down 5 +down 5 +down 2 +down 9 +down 4 +forward 5 +down 5 +up 1 +forward 4 +down 6 +down 5 +up 8 +up 4 +down 8 +forward 4 +down 8 +forward 4 +down 2 +down 8 +forward 3 +forward 7 +down 1 +forward 3 +forward 7 +forward 1 +down 4 +forward 2 +down 3 +down 4 +forward 1 +up 6 +forward 8 +down 5 +up 6 +up 3 +forward 7 +down 3 +forward 4 +forward 9 +forward 2 +up 2 +up 7 +forward 1 +up 8 +down 6 +up 5 +down 3 +up 7 +down 4 +up 7 +down 8 +down 7 +forward 5 +up 7 +down 1 +up 9 +down 2 +down 8 +down 5 +forward 4 +down 3 +up 4 +down 2 +forward 6 +down 2 +forward 9 +up 9 +up 8 +forward 3 +forward 7 +forward 7 +up 4 +up 3 +up 4 +forward 1 +down 2 +up 6 +down 2 +down 4 +up 3 +down 8 +down 9 +down 4 +forward 6 +down 5 +down 5 +forward 7 +down 2 +forward 8 +up 2 +up 7 +down 5 +down 7 +up 9 +up 4 +up 5 +down 4 +down 8 +down 9 +down 7 +down 1 +down 1 +up 7 +up 8 +down 5 +forward 2 +up 3 +down 2 +down 9 +down 4 +forward 1 +forward 1 +up 4 +down 9 +up 7 +forward 7 +up 8 +up 4 +down 2 +down 1 +forward 2 +up 4 +down 3 +up 7 +down 7 +down 6 +down 4 +up 3 +down 7 +forward 5 +down 6 +down 9 +down 3 +forward 1 +down 6 +forward 3 +down 5 +up 1 +forward 5 +forward 4 +forward 8 +forward 1 +up 4 +down 2 +down 7 +down 9 +up 4 +up 6 +forward 8 +up 4 +down 8 +forward 7 +forward 1 +down 7 +forward 9 +forward 1 +forward 7 +forward 9 +down 3 +forward 4 +down 3 +down 3 +down 3 +down 1 +down 5 +forward 1 +forward 7 +up 5 +forward 5 +forward 4 +forward 7 +down 7 +up 5 +forward 1 +forward 8 +down 3 +up 6 +down 7 +forward 6 +down 8 +forward 6 +up 4 +down 9 +up 1 +forward 4 +forward 8 +down 5 +forward 7 +up 9 +forward 2 +up 2 +forward 7 +down 3 +forward 2 +down 7 +down 1 +forward 9 +forward 3 +up 5 +forward 7 +up 4 +forward 2 +down 3 +down 2 +down 8 +forward 7 +down 8 +down 3 +forward 9 +forward 9 +forward 5 +up 8 +forward 9 +up 2 +forward 2 +up 4 +forward 2 +forward 1 +forward 7 +forward 6 +down 5 +forward 5 +forward 1 +forward 7 +forward 4 +down 5 +down 9 +down 8 +forward 5 +up 5 +up 1 +down 8 +down 9 +forward 1 +down 5 +forward 6 +down 1 +down 7 +down 7 +down 4 +forward 3 +down 5 +down 8 +forward 2 +down 4 +forward 3 +down 1 +up 5 +down 8 +forward 9 +up 6 +up 4 +down 6 +down 9 +forward 2 +forward 5 +down 3 +forward 2 +down 5 +forward 1 +forward 4 +down 6 +down 4 +up 2 +down 9 +forward 2 +up 8 +down 4 +forward 7 +down 5 +forward 8 +down 1 +forward 5 +down 7 +up 5 +down 7 +down 4 +forward 3 +down 1 +forward 7 +forward 9 +up 9 +forward 5 +forward 8 +up 8 +forward 6 +down 5 +down 8 +forward 9 +forward 3 +down 3 +forward 9 +forward 7 +forward 6 +forward 1 +up 2 +forward 8 +down 9 +down 5 +down 5 +down 4 +forward 7 +down 8 +down 7 +forward 8 +forward 2 +down 5 +forward 2 +forward 3 +down 6 +down 8 +up 8 +forward 7 +down 7 +up 7 +forward 5 +up 6 +forward 7 +up 6 +forward 8 +forward 5 +up 6 +forward 1 +down 5 +forward 1 +up 5 +down 1 +forward 6 +forward 3 +up 2 +forward 9 +forward 8 +down 9 +forward 7 +forward 7 +forward 8 +up 9 +down 8 +up 1 +down 4 +forward 2 +forward 7 +down 1 +up 7 +down 5 +forward 2 +down 4 +down 8 +forward 6 +down 3 +forward 8 +up 6 +forward 5 +forward 7 +down 5 +down 1 +down 7 +down 7 +up 8 +down 5 +forward 4 +down 5 +down 7 +down 2 +up 8 +forward 6 +up 1 +down 3 +forward 9 +up 1 +down 7 +forward 2 +down 6 +forward 6 +up 3 +up 9 +up 2 +forward 4 +forward 4 +down 4 +down 4 +down 2 +down 5 +forward 7 +forward 6 +forward 9 +down 9 +forward 6 +up 1 +down 2 +down 4 +down 7 +down 5 +down 4 +up 2 +up 8 +down 6 +forward 2 +up 7 +down 2 +up 5 +down 8 +forward 3 +up 2 +forward 3 +forward 5 +forward 9 +forward 2 +forward 8 +forward 1 +down 5 +up 6 +forward 9 +forward 4 +up 8 +down 8 +up 2 +down 9 +down 3 +down 5 +up 4 +forward 2 +down 5 +forward 6 +down 6 +forward 2 +forward 7 +forward 6 +forward 1 +down 7 +forward 8 +up 2 +forward 5 +forward 5 +up 3 +forward 2 +forward 3 +forward 8 +forward 4 +down 1 +down 9 +up 5 +down 5 +forward 1 +down 8 +up 3 +down 9 +forward 5 +forward 2 +forward 2 +up 1 +forward 1 +down 5 +forward 4 +up 4 +up 3 +up 3 +down 4 +down 5 +down 1 +forward 8 +down 4 +up 7 +down 6 +forward 5 +forward 4 +forward 8 +forward 8 +up 3 +forward 7 +down 4 +forward 8 +forward 4 +forward 6 +down 8 +down 6 +down 1 +forward 4 +down 8 +down 6 +forward 2 +down 8 +up 7 +down 2 +forward 5 +down 4 +down 7 +down 8 +forward 5 +down 4 +down 2 +down 7 +down 4 +forward 7 +forward 3 +up 4 +down 7 +down 9 +up 4 +up 5 +down 7 +up 5 +down 3 +down 5 +forward 8 +up 1 +up 9 +forward 9 +forward 7 +down 2 +up 1 +up 7 +down 3 +forward 3 +up 6 +forward 1 +forward 2 +down 4 +down 3 +forward 4 +forward 7 +forward 9 +down 8 +down 6 +forward 1 +forward 3 +forward 2 +up 3 +down 6 +down 7 +up 8 +down 5 +up 6 +down 8 +forward 4 +up 3 +forward 3 +forward 4 +down 5 +up 5 +down 4 +down 5 +down 5 +forward 3 +up 9 +down 8 +down 2 +down 7 +down 4 +down 3 +up 2 +forward 6 +down 4 +down 1 +down 4 +forward 1 +forward 8 +down 3 +down 7 +down 3 +forward 1 +down 9 +down 7 +down 3 +down 3 +down 6 +down 8 +down 2 +down 5 +up 1 +up 7 +forward 9 +forward 6 +forward 7 +forward 8 +up 7 +down 9 +down 4 +down 7 +forward 2 +forward 4 +forward 1 +forward 4 +forward 3 +forward 8 +down 5 +forward 8 +up 4 +up 9 +forward 3 +down 7 +forward 9 +down 2 +forward 5 +up 7 +down 4 +down 3 +down 5 +down 4 +forward 9 +forward 5 +forward 6 +forward 6 +down 2 +down 7 +forward 4 +up 5 +down 8 +down 9 +forward 5 +down 8 +forward 9 +up 6 +forward 8 +forward 7 +up 7 +down 9 +forward 5 +down 9 +forward 7 +down 5 +down 7 +forward 9 +forward 4 +up 1 +up 9 +forward 7 +up 5 +up 2 +down 6 +forward 7 +down 2 +forward 6 +forward 7 +down 4 +up 3 +up 9 +forward 4 +forward 6 +forward 3 +up 6 +down 5 +up 2 +forward 3 +down 5 +forward 1 +up 7 +down 8 +up 4 +forward 9 +forward 6 +down 7 +forward 4 +down 9 +down 8 +down 7 +forward 7 +down 5 +forward 3 +up 5 +forward 9 +forward 7 +forward 3 +down 5 +forward 8 +down 3 +forward 1 +down 3 +down 3 +forward 2 +down 4 +forward 7 +up 1 +down 6 +up 3 +forward 8 +down 6 +forward 6 +down 5 +down 4 +forward 3 +up 1 +forward 5 +forward 5 +forward 2 +up 9 +forward 3 +down 5 +up 3 +up 4 +down 7 +down 4 +up 3 +up 3 +forward 2 +up 2 +forward 8 +down 9 +down 1 +up 8 +down 2 +up 4 +forward 9 +up 1 +down 8 +forward 3 +up 9 +down 7 +down 5 +down 9 +down 1 +down 2 +down 9 +down 4 +down 8 +down 8 +down 9 +down 2 +down 6 +down 9 +forward 8 \ No newline at end of file diff --git a/two/main.go b/two/main.go new file mode 100644 index 0000000..5222da6 --- /dev/null +++ b/two/main.go @@ -0,0 +1,39 @@ +package two + +import "fmt" + +type Two struct { + sub sub +} + +func Init(filepath string) *Two { + two := &Two{ + sub: sub{}, + } + + two.sub.load(filepath) + + return two +} + +func (d *Two) Answer() string { + d.sub.reset() + d.sub.execute() + + return fmt.Sprintf("Horizontal is %d, depth is %d, answer is %d", + d.sub.horizontal, + d.sub.depth, + d.sub.horizontal*d.sub.depth, + ) +} + +func (d *Two) FollowUp() string { + d.sub.reset() + d.sub.executeWithAim() + + return fmt.Sprintf("Horizontal is %d, depth is %d, answer is %d", + d.sub.horizontal, + d.sub.depth, + d.sub.horizontal*d.sub.depth, + ) +} diff --git a/two/sub.go b/two/sub.go new file mode 100644 index 0000000..e80666b --- /dev/null +++ b/two/sub.go @@ -0,0 +1,87 @@ +package two + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +type command struct { + instruction string + value int +} + +type sub struct { + input []command + depth int + horizontal int + aim int +} + +// load Loads the commands from input.txt into the sub +func (s *sub) load(filename string) error { + s.input = []command{} + + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + parts := strings.Split(scanner.Text(), " ") + if len(parts) != 2 { + return fmt.Errorf("Unable to parse input: %s", parts) + } + + value, err := strconv.Atoi(parts[1]) + if err != nil { + return err + } + s.input = append(s.input, command{ + instruction: parts[0], + value: value, + }) + } + + return nil +} + +func (s *sub) reset() { + s.horizontal = 0 + s.depth = 0 + s.aim = 0 +} + +func (s *sub) execute() { + for _, command := range s.input { + switch command.instruction { + case "forward": + s.horizontal += command.value + case "up": + s.depth -= command.value + if s.depth < 0 { + s.depth = 0 + } + case "down": + s.depth += command.value + } + } +} + +func (s *sub) executeWithAim() { + for _, command := range s.input { + switch command.instruction { + case "forward": + s.horizontal += command.value + s.depth += s.aim * command.value + case "up": + s.aim -= command.value + case "down": + s.aim += command.value + } + } +} diff --git a/two/sub_test.go b/two/sub_test.go new file mode 100644 index 0000000..bf50dc7 --- /dev/null +++ b/two/sub_test.go @@ -0,0 +1,80 @@ +package two + +import ( + "strconv" + "strings" + "testing" +) + +var testInput = []string{ + "forward 5", + "down 5", + "forward 8", + "up 3", + "down 8", + "forward 2", +} + +func Test_scan(t *testing.T) { + s := sub{} + if err := s.load("input.txt"); err != nil { + t.FailNow() + } + + if len(s.input) != 1000 { + t.Logf("Expected 1000 commands, found %d", len(s.input)) + t.Fail() + } +} + +func Test_execute(t *testing.T) { + s := sub{ + input: []command{}, + } + + for _, raw := range testInput { + parts := strings.Split(raw, " ") + value, _ := strconv.Atoi(parts[1]) + s.input = append(s.input, command{ + instruction: parts[0], + value: value, + }) + } + + s.execute() + if s.horizontal != 15 { + t.Logf("Expected horizontal of 15, found %d", s.horizontal) + t.FailNow() + } + + if s.depth != 10 { + t.Logf("Expected depth of 10, found %d", s.depth) + t.FailNow() + } +} + +func Test_executeWithAim(t *testing.T) { + s := sub{ + input: []command{}, + } + + for _, raw := range testInput { + parts := strings.Split(raw, " ") + value, _ := strconv.Atoi(parts[1]) + s.input = append(s.input, command{ + instruction: parts[0], + value: value, + }) + } + + s.executeWithAim() + if s.horizontal != 15 { + t.Logf("Expected horizontal of 15, found %d", s.horizontal) + t.FailNow() + } + + if s.depth != 60 { + t.Logf("Expected depth of 60, found %d", s.depth) + t.FailNow() + } +}