package main import ( "aoc2015/aoclib" "aoc2015/day01" "aoc2015/day02" "aoc2015/day03" "aoc2015/day04" "aoc2015/day05" "aoc2015/day06" "aoc2015/day07" "aoc2015/day08" "aoc2015/day09" "flag" "fmt" "os" "path/filepath" ) var dayFunctions map[int]map[int]func(puzzle aoclib.Puzzle) 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 = make(map[int]map[int]func(puzzle aoclib.Puzzle) interface{}, 25) dayFunctions[1] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[1][1] = day01.Part1 dayFunctions[1][2] = day01.Part2 dayFunctions[2] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[2][1] = day02.Part1 dayFunctions[2][2] = day02.Part2 dayFunctions[3] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[3][1] = day03.Part1 dayFunctions[3][2] = day03.Part2 dayFunctions[4] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[4][1] = day04.Part1 dayFunctions[4][2] = day04.Part2 dayFunctions[5] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[5][1] = day05.Part1 dayFunctions[5][2] = day05.Part2 dayFunctions[6] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[6][1] = day06.Part1 dayFunctions[6][2] = day06.Part2 dayFunctions[7] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[7][1] = day07.Part1 dayFunctions[7][2] = day07.Part2 dayFunctions[8] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[8][1] = day08.Part1 dayFunctions[8][2] = day08.Part2 dayFunctions[9] = make(map[int]func(puzzle aoclib.Puzzle) interface{}, 2) dayFunctions[9][1] = day09.Part1 dayFunctions[9][2] = day09.Part2 } func execute(thisDay int) { p := aoclib.Puzzle{} 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) } } }