package main import ( "flag" "fmt" "log" "time" "snikolov.me/aoc2022/day1" "snikolov.me/aoc2022/day10" "snikolov.me/aoc2022/day2" "snikolov.me/aoc2022/day3" "snikolov.me/aoc2022/day4" "snikolov.me/aoc2022/day5" "snikolov.me/aoc2022/day6" "snikolov.me/aoc2022/day7" "snikolov.me/aoc2022/day8" "snikolov.me/aoc2022/day9" "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: &day1.Solver{}, 2: &day2.Solver{}, 3: &day3.Solver{}, 4: &day4.Solver{}, 5: &day5.Solver{}, 6: &day6.Solver{}, 7: &day7.Solver{}, 8: &day8.Solver{}, 9: &day9.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) }