day01
This commit is contained in:
commit
cd36674648
62
day01/day.go
Normal file
62
day01/day.go
Normal file
@ -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)
|
||||||
|
}
|
||||||
1
inputs/1
Normal file
1
inputs/1
Normal file
@ -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
|
||||||
1
inputs/1_test
Normal file
1
inputs/1_test
Normal file
@ -0,0 +1 @@
|
|||||||
|
R5, L5, R5, R3
|
||||||
82
main.go
Normal file
82
main.go
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user