2022-12-01 16:27:32 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"flag"
|
|
|
|
|
"fmt"
|
|
|
|
|
"log"
|
|
|
|
|
"time"
|
2022-12-05 08:03:39 +00:00
|
|
|
|
2022-12-10 09:37:21 +00:00
|
|
|
"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"
|
2022-12-10 09:34:40 +00:00
|
|
|
"snikolov.me/aoc2022/day10"
|
2022-12-11 19:15:08 +00:00
|
|
|
"snikolov.me/aoc2022/day11"
|
2022-12-05 08:03:39 +00:00
|
|
|
|
|
|
|
|
"snikolov.me/aoc2022/utils"
|
2022-12-01 16:27:32 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
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{
|
2022-12-10 09:37:21 +00:00
|
|
|
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{},
|
2022-12-10 09:34:40 +00:00
|
|
|
10: &day10.Solver{},
|
2022-12-11 19:15:08 +00:00
|
|
|
11: &day11.Solver{},
|
2022-12-01 16:27:32 +00:00
|
|
|
}
|
|
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-05 08:03:39 +00:00
|
|
|
var solution any
|
2022-12-01 16:27:32 +00:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-07 11:55:13 +00:00
|
|
|
fmt.Printf("%s: %v\n", time.Now().Sub(startTime), solution)
|
2022-12-01 16:27:32 +00:00
|
|
|
}
|