package main import ( "flag" "fmt" "log" "time" "snikolov.me/aoc2022/day01" "snikolov.me/aoc2022/day02" "snikolov.me/aoc2022/day03" "snikolov.me/aoc2022/day04" "snikolov.me/aoc2022/day05" "snikolov.me/aoc2022/day06" "snikolov.me/aoc2022/day07" "snikolov.me/aoc2022/day08" "snikolov.me/aoc2022/day09" "snikolov.me/aoc2022/day10" "snikolov.me/aoc2022/utils" ) type Args struct { DayNumber int PartNumber int TestMode bool DownloadInput bool } func main() { var args Args flag.IntVar(&args.DayNumber, "day", 0, "day number") flag.IntVar(&args.PartNumber, "part", 0, "day part number") flag.BoolVar(&args.TestMode, "test", false, "use test input") flag.BoolVar(&args.DownloadInput, "download-input", false, "download production input") flag.Parse() inputFileName := utils.GetInputFileName(args.DayNumber, args.TestMode) if args.DownloadInput { const sessionCookie = "53616c7465645f5f63d2a07212d6266c5e8de3664d5684dac31a6031e5ddf4c1ec004e5475bf45a16c9f9919fae43b7344135650408c9aec716880afd94bbc0b" if err := utils.DownloadInput(sessionCookie, args.DayNumber, inputFileName); err != nil { log.Fatalf("Could not download puzzle input: %s", err) } } else { solve(args, inputFileName) } } func solve(args Args, inputFileName string) { solvers := map[int]utils.Solver{ 1: &day01.Solver{}, 2: &day02.Solver{}, 3: &day03.Solver{}, 4: &day04.Solver{}, 5: &day05.Solver{}, 6: &day06.Solver{}, 7: &day07.Solver{}, 8: &day08.Solver{}, 9: &day09.Solver{}, 10: &day10.Solver{}, } solver, ok := solvers[args.DayNumber] if !ok { log.Fatalf("Could not find a solver for day %d", args.DayNumber) } startTime := time.Now() if input, err := utils.ReadInput(inputFileName); err == nil { solver.ParseInput(input) } else { log.Fatalf("Could not read input for day %d: %s", args.DayNumber, err) } var solution any switch args.PartNumber { case 1: solution = solver.SolvePart1() case 2: solution = solver.SolvePart2() default: log.Fatal("unknown part number, please use 1 or 2") return } fmt.Printf("%s: %v\n", time.Now().Sub(startTime), solution) }