aoc-2022/main.go

80 lines
1.8 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"time"
"snikolov.me/aoc2022/day1"
"snikolov.me/aoc2022/day2"
"snikolov.me/aoc2022/day3"
"snikolov.me/aoc2022/day4"
"snikolov.me/aoc2022/day5"
"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{},
}
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: %d\n", time.Now().Sub(startTime), solution)
}