AoC2021/src/main.rs

116 lines
3.7 KiB
Rust
Raw Permalink Normal View History

2021-12-01 17:07:17 +01:00
use std::fs::read_to_string;
use chrono::Datelike;
2021-12-01 20:53:49 +01:00
use clap::{App, Arg};
use crate::day01::Day01;
2021-12-02 08:50:56 +01:00
use crate::day02::Day02;
2021-12-03 10:02:46 +01:00
use crate::day03::Day03;
2021-12-04 09:52:49 +01:00
use crate::day04::Day04;
2021-12-05 11:59:48 +01:00
use crate::day05::Day05;
2021-12-06 09:12:49 +01:00
use crate::day06::Day06;
2021-12-07 10:12:57 +01:00
use crate::day07::Day07;
2021-12-01 17:07:17 +01:00
use crate::day::Day;
2021-12-07 19:40:41 +01:00
use anyhow::Result;
2021-12-08 09:56:50 +01:00
use crate::day08::Day08;
2021-12-09 12:19:43 +01:00
use crate::day09::Day09;
2021-12-10 10:04:00 +01:00
use crate::day10::Day10;
2021-12-11 09:45:35 +01:00
use crate::day11::Day11;
2021-12-12 13:08:29 +01:00
use crate::day12::Day12;
2021-12-13 10:54:03 +01:00
use crate::day13::Day13;
2021-12-14 12:20:03 +01:00
use crate::day14::Day14;
2021-12-15 14:25:05 +01:00
use crate::day15::Day15;
2021-12-16 12:49:57 +01:00
use crate::day16::Day16;
2021-12-17 10:08:53 +01:00
use crate::day17::Day17;
2021-12-01 17:07:17 +01:00
mod day;
2021-12-01 20:53:49 +01:00
mod day01;
2021-12-02 08:50:56 +01:00
mod day02;
2021-12-03 10:02:46 +01:00
mod day03;
2021-12-04 09:52:49 +01:00
mod day04;
2021-12-05 11:59:48 +01:00
mod day05;
2021-12-06 09:12:49 +01:00
mod day06;
2021-12-07 10:12:57 +01:00
mod day07;
2021-12-08 09:56:50 +01:00
mod day08;
2021-12-09 12:19:43 +01:00
mod day09;
2021-12-10 10:04:00 +01:00
mod day10;
2021-12-11 09:45:35 +01:00
mod day11;
2021-12-12 13:08:29 +01:00
mod day12;
2021-12-13 10:54:03 +01:00
mod day13;
2021-12-14 12:20:03 +01:00
mod day14;
2021-12-15 14:25:05 +01:00
mod day15;
2021-12-16 12:49:57 +01:00
mod day16;
2021-12-17 10:08:53 +01:00
mod day17;
2021-12-01 17:07:17 +01:00
2021-12-07 19:40:41 +01:00
fn load_input(day: &str) -> Result<String> {
read_to_string(format!("./input/day{}", day)).map_err(|x| x.into())
2021-12-01 17:07:17 +01:00
}
2021-12-07 19:40:41 +01:00
fn run_day(days: &[Box<dyn Day>], day: usize) -> Result<()> {
2021-12-01 17:07:17 +01:00
if let Some(d) = days.get(day - 1) {
2021-12-03 10:02:46 +01:00
let day_code = d;
2021-12-01 17:07:17 +01:00
println!("Running day {}!", day);
2021-12-07 19:40:41 +01:00
println!("\tPart 1: {}", d.part1()?);
println!("\tPart 2: {}", day_code.part2()?);
2021-12-01 17:07:17 +01:00
} else {
eprintln!("Day {} is not available!", day);
}
2021-12-07 19:40:41 +01:00
Ok(())
2021-12-01 17:07:17 +01:00
}
2021-12-07 19:40:41 +01:00
fn main() -> anyhow::Result<()> {
2021-12-01 17:07:17 +01:00
let matches = App::new("AOC Time!")
.version("1.0")
.author("J00LZ")
.about("How to overengineer AOC in a single program...")
.arg(Arg::with_name("v")
.short("v")
.multiple(true)
.help("Sets the level of verbosity"))
.arg(Arg::with_name("all")
.short("a")
.long("all")
.help("run all available days"))
.arg(Arg::with_name("DAY")
.takes_value(true)
.multiple(true))
.get_matches();
2021-12-07 19:40:41 +01:00
let days: Vec<Box<dyn Day>> = vec![Box::new(Day01::init(load_input("01")?)?),
Box::new(Day02::init(load_input("02")?)?),
Box::new(Day03::init(load_input("03")?)?),
Box::new(Day04::init(load_input("04")?)?),
Box::new(Day05::init(load_input("05")?)?),
Box::new(Day06::init(load_input("06")?)?),
2021-12-08 09:56:50 +01:00
Box::new(Day07::init(load_input("07")?)?),
2021-12-09 12:19:43 +01:00
Box::new(Day08::init(load_input("08")?)?),
2021-12-10 10:04:00 +01:00
Box::new(Day09::init(load_input("09")?)?),
2021-12-11 09:45:35 +01:00
Box::new(Day10::init(load_input("10")?)?),
2021-12-12 13:08:29 +01:00
Box::new(Day11::init(load_input("11")?)?),
2021-12-13 10:54:03 +01:00
Box::new(Day12::init(load_input("12")?)?),
2021-12-14 12:20:03 +01:00
Box::new(Day13::init(load_input("13")?)?),
2021-12-15 14:25:05 +01:00
Box::new(Day14::init(load_input("14")?)?),
2021-12-16 12:49:57 +01:00
Box::new(Day15::init(load_input("15")?)?),
2021-12-17 10:08:53 +01:00
Box::new(Day16::init(load_input("16")?)?),
Box::new(Day17::init(load_input("17")?)?),];
2021-12-01 17:07:17 +01:00
2021-12-01 20:53:49 +01:00
let _verbosity = matches.occurrences_of("v");
2021-12-01 17:07:17 +01:00
if matches.is_present("all") {
let l = days.len();
println!("running {} days!", l);
2021-12-03 10:02:46 +01:00
for v in 1..=l {
2021-12-07 19:40:41 +01:00
run_day(&days, v)?;
2021-12-01 17:07:17 +01:00
}
} else if let Some(d) = matches.values_of("DAY") {
2021-12-07 19:40:41 +01:00
let d = d.map(str::parse);
2021-12-01 17:07:17 +01:00
for v in d {
2021-12-07 19:40:41 +01:00
run_day(&days, v?)?;
2021-12-01 17:07:17 +01:00
}
} else {
let v = chrono::Local::now();
if v.month() != 12 {
2021-12-03 10:02:46 +01:00
println!("This was really only meant to be used in december...");
}
2021-12-07 19:40:41 +01:00
run_day(&days, v.day() as usize)?;
2021-12-01 17:07:17 +01:00
}
2021-12-07 19:40:41 +01:00
Ok(())
2021-12-01 17:07:17 +01:00
}