76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"aoc2015/aoclib"
|
|
"aoc2015/day01"
|
|
"aoc2015/day02"
|
|
"aoc2015/day03"
|
|
"aoc2015/day04"
|
|
"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{})
|
|
dayFunctions[1] = make(map[int]func(puzzle aoclib.Puzzle) interface{})
|
|
dayFunctions[1][1] = day01.Part1
|
|
dayFunctions[1][2] = day01.Part2
|
|
dayFunctions[2] = make(map[int]func(puzzle aoclib.Puzzle) interface{})
|
|
dayFunctions[2][1] = day02.Part1
|
|
dayFunctions[2][2] = day02.Part2
|
|
dayFunctions[3] = make(map[int]func(puzzle aoclib.Puzzle) interface{})
|
|
dayFunctions[3][1] = day03.Part1
|
|
dayFunctions[3][2] = day03.Part2
|
|
dayFunctions[4] = make(map[int]func(puzzle aoclib.Puzzle) interface{})
|
|
dayFunctions[4][1] = day04.Part1
|
|
dayFunctions[4][2] = day04.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)
|
|
}
|
|
}
|
|
}
|