commit cd3667464866c67838a5e60b6287fec030208510 Author: Stefan Harmuth Date: Mon Jan 4 07:50:00 2021 +0100 day01 diff --git a/day01/day.go b/day01/day.go new file mode 100644 index 0000000..b92d13d --- /dev/null +++ b/day01/day.go @@ -0,0 +1,62 @@ +package day01 + +import ( + "strconv" + "strings" + "tools" +) + +func getDistanceFromStart(instructions []string, breakOnRevisit bool) int { + x := 0 + y := 0 + z := 0 + visited := tools.NewSet() + + for _, instruction := range instructions { + switch instruction[0] { + case 'R': + z++ + z = z % 4 + case 'L': + z-- + if z < 0 { + z += 4 + } + } + distance, _ := strconv.Atoi(instruction[1:]) + for i := 0; i < distance; i++ { + switch z { + case 0: + y-- + case 1: + x++ + case 2: + y++ + case 3: + x-- + } + + if breakOnRevisit { + if visited.Contains(tools.Coordinate{X: x, Y: y}) { + return tools.Abs(x) + tools.Abs(y) + } else { + visited.Add(tools.Coordinate{X: x, Y: y}) + } + } + } + } + + return tools.Abs(x) + tools.Abs(y) +} + +func Part1(puzzle tools.AoCPuzzle) interface{} { + instructions := puzzle.GetInputArray() + + return getDistanceFromStart(strings.Split(instructions[0], ", "), false) +} + +func Part2(puzzle tools.AoCPuzzle) interface{} { + instructions := puzzle.GetInputArray() + + return getDistanceFromStart(strings.Split(instructions[0], ", "), true) +} diff --git a/inputs/1 b/inputs/1 new file mode 100644 index 0000000..34a1e76 --- /dev/null +++ b/inputs/1 @@ -0,0 +1 @@ +R4, R4, L1, R3, L5, R2, R5, R1, L4, R3, L5, R2, L3, L4, L3, R1, R5, R1, L3, L1, R3, L1, R2, R2, L2, R5, L3, L4, R4, R4, R2, L4, L1, R5, L1, L4, R4, L1, R1, L2, R5, L2, L3, R2, R1, L194, R2, L4, R49, R1, R3, L5, L4, L1, R4, R2, R1, L5, R3, L5, L4, R4, R4, L2, L3, R78, L5, R4, R191, R4, R3, R1, L2, R1, R3, L1, R3, R4, R2, L2, R1, R4, L5, R2, L2, L4, L2, R1, R2, L3, R5, R2, L3, L3, R3, L1, L1, R5, L4, L4, L2, R5, R1, R4, L3, L5, L4, R5, L4, R5, R4, L3, L2, L5, R4, R3, L3, R1, L5, R5, R1, L3, R2, L5, R5, L3, R1, R4, L5, R4, R2, R3, L4, L5, R3, R4, L5, L5, R4, L4, L4, R1, R5, R3, L1, L4, L3, L4, R1, L5, L1, R2, R2, R4, R4, L5, R4, R1, L1, L1, L3, L5, L2, R4, L3, L5, L4, L1, R3 \ No newline at end of file diff --git a/inputs/1_test b/inputs/1_test new file mode 100644 index 0000000..b781c2d --- /dev/null +++ b/inputs/1_test @@ -0,0 +1 @@ +R5, L5, R5, R3 \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..54af919 --- /dev/null +++ b/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "aoc2016/day01" + "flag" + "fmt" + "os" + "path/filepath" + "tools" +) + +var dayFunctions map[int]map[int]func(puzzle tools.AoCPuzzle) interface{} +var day int +var part int +var test bool +var timeit bool +var timeitNumber int +var myDir, _ = filepath.Abs(filepath.Dir(os.Args[0])) + +func initDayFunctions() { + dayFunctions = map[int]map[int]func(puzzle tools.AoCPuzzle) interface{}{ + 1: {1: day01.Part1, 2: day01.Part2}, + // 2: {1: day02.Part1, 2: day02.Part2}, + // 3: {1: day03.Part1, 2: day03.Part2}, + // 4: {1: day04.Part1, 2: day04.Part2}, + // 5: {1: day05.Part1, 2: day05.Part2}, + // 6: {1: day06.Part1, 2: day06.Part2}, + // 7: {1: day07.Part1, 2: day07.Part2}, + // 8: {1: day08.Part1, 2: day08.Part2}, + // 9: {1: day09.Part1, 2: day09.Part2}, + // 10: {1: day10.Part1, 2: day10.Part2}, + // 11: {1: day11.Part1, 2: day11.Part2}, + // 12: {1: day12.Part1, 2: day12.Part2}, + // 13: {1: day13.Part1, 2: day13.Part2}, + // 14: {1: day14.Part1, 2: day14.Part2}, + // 15: {1: day15.Part1, 2: day15.Part2}, + // 16: {1: day16.Part1, 2: day16.Part2}, + // 17: {1: day17.Part1, 2: day17.Part2}, + // 18: {1: day18.Part1, 2: day18.Part2}, + // 19: {1: day19.Part1, 2: day19.Part2}, + // 20: {1: day20.Part1, 2: day20.Part2}, + // 21: {1: day21.Part1, 2: day21.Part2}, + } +} + +func execute(thisDay int) { + p := tools.AoCPuzzle{} + if test { + p.FromFile = fmt.Sprintf("%s/inputs/%d_test", myDir, thisDay) + } else { + p.FromFile = fmt.Sprintf("%s/inputs/%d", myDir, thisDay) + } + p.ReadInputFromFile() + if part == -1 || part == 1 { + p.Solve(dayFunctions[thisDay][1], thisDay, 1, timeit, timeitNumber) + } + if part == -1 || part == 2 { + p.Solve(dayFunctions[thisDay][2], thisDay, 2, timeit, timeitNumber) + } +} + +func main() { + initDayFunctions() + flag.IntVar(&day, "day", -1, "day to execute; -1 = all") + flag.IntVar(&part, "part", -1, "part to execute; -1 = all") + flag.BoolVar(&test, "test", false, "run the test case") + flag.BoolVar(&timeit, "timeit", false, "measure execution time") + flag.IntVar(&timeitNumber, "timeitNumber", 50, "build time average of this many runs") + flag.Parse() + + if day != -1 { + if _, ok := dayFunctions[day]; !ok { + fmt.Printf("ERROR: unknown/invalid day: %d\n", day) + os.Exit(1) + } + execute(day) + } else { + for thisDay := range dayFunctions { + execute(thisDay) + } + } +}