aoc2015/main.go
2020-12-26 10:26:29 +01:00

104 lines
3.1 KiB
Go

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