diff --git a/.envrc b/.envrc index b524e39..3550a30 100644 --- a/.envrc +++ b/.envrc @@ -1,7 +1 @@ use flake - -if [[ $(date +'%m') -eq 12 ]] -then - export ADVENT_YEAR=$(date +'%Y') - export ADVENT_DAY=$(date +'%d') -fi diff --git a/README.md b/README.md index b9f9596..80c58b2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # My Advent of Code solutions, written as an exercise to learn Rust. -To run, simply edit `src/main.rs` and run it. Optionally, set the year and day via `ADVENT_YEAR` and `ADVENT_DAY` environment variables. By setting `ADVENT_TOKEN` to your browser session token, your personal input can optionally be fetched automatically. +To run, simply edit ´src/main.rs´ and run it. Optionally, set the year and day via ´ADVENT_YEAR´ and ´ADVENT_DAY´ environment variables. By setting ´ADVENT_TOKEN´ to your browser session token, your personal input can optionally be fetched automatically. diff --git a/aoc2023/src/day01.rs b/aoc2023/src/day01.rs index 49cc0c6..3955f1a 100644 --- a/aoc2023/src/day01.rs +++ b/aoc2023/src/day01.rs @@ -22,7 +22,7 @@ impl Solution for Day01 { } } - sum += 10 * first.expect(word) + last.expect(word) + sum += 10 * first.unwrap() + last.unwrap() } Answer::from(sum) diff --git a/aoc2024/src/day01.rs b/aoc2024/src/day01.rs index a901811..5b1cab5 100644 --- a/aoc2024/src/day01.rs +++ b/aoc2024/src/day01.rs @@ -37,7 +37,7 @@ impl Solution for Day01 { fn parse(input: &str) -> (Vec, Vec) { input.lines() .map(|line| line.split_once(" ") - .expect(line) + .unwrap() ) .map(|(x, y)| (x.parse::().unwrap(), y.parse::().unwrap())) .unzip() diff --git a/data/README.md b/data/README.md index 3c85c67..df9e854 100644 --- a/data/README.md +++ b/data/README.md @@ -1,14 +1 @@ ## The author of adventofcode.com, Eric Wastl, does not want puzzle input to be shared: https://adventofcode.com/about - -Either manually place it here, with the folder structure - -``` -data/ - 2024/ - day01 - day02 - day03 - ... -``` - -or set ADVENT_TOKEN to your session cookie to automatically fetch your input at runtime. diff --git a/src/fetch_input.rs b/src/fetch_input.rs deleted file mode 100644 index 589ad61..0000000 --- a/src/fetch_input.rs +++ /dev/null @@ -1,29 +0,0 @@ -use reqwest::{blocking::Client, Url}; - -use std::fs::File; -use std::io::prelude::*; -use std::sync::Arc; -use std::env; - -pub fn fetch_input(year: usize, day: usize) -> Result<(), Box> { - let url = format!("https://adventofcode.com/{year}/day/{day}/input"); - let session_cookie = env::var("ADVENT_TOKEN")?; - - let jar = reqwest::cookie::Jar::default(); - jar.add_cookie_str(&format!("session={session_cookie}; Domain=.adventofcode.com"), &"https://adventofcode.com".parse::().unwrap()); - - let client = Client::builder().cookie_provider(Arc::new(jar)).build().unwrap(); - let response = client - .get(url) - .send()?; - - let body = response.text()?; - - let path = format!("./data/{}/day{:02}", year, day); - - let mut output = File::create(path)?; - - output.write_all(body.as_bytes())?; - - Ok(()) -} diff --git a/src/input_data.rs b/src/input_data.rs index 131bbf6..5b4e611 100644 --- a/src/input_data.rs +++ b/src/input_data.rs @@ -5,8 +5,7 @@ pub fn load_actual(year: usize, day: usize) -> io::Result { fs::read_to_string(path) } -pub fn load_test(year: usize, day: usize) -> (io::Result, io::Result) { - let input_path = format!("./examples/{year}/day{:02}", day); - let result_path = format!("./examples/{year}/day{:02}_solution", day); - (fs::read_to_string(input_path), fs::read_to_string(result_path)) +pub fn load_test(year: usize, day: usize) -> io::Result { + let path = format!("./examples/{year}/day{:02}", day); + fs::read_to_string(path) } diff --git a/src/main.rs b/src/main.rs index 563d75f..e65dc88 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,51 +4,61 @@ use solution::solution; mod input_data; use input_data::load_actual; -mod fetch_input; -use fetch_input::fetch_input; +use reqwest::{blocking::Client, Url}; -use std::{path::Path, time::Instant, env}; +use std::fs::File; +use std::io::prelude::*; +use std::path::Path; +use std::sync::Arc; +use std::{time::Instant, env}; fn main() { - let year = env::var("ADVENT_YEAR") - .unwrap_or("2024".into()) - .parse() - .unwrap(); - let day = env::var("ADVENT_DAY") - .unwrap_or("1".into()) - .parse() - .unwrap(); + let year = 2024; + let day = 1; - if ! Path::new(&format!("./data/{}/day{:02}", year, day)).exists() - && env::var("ADVENT_TOKEN").is_ok() { - fetch_input(year, day).expect("Set ADVENT_TOKEN to the correct session cookie to fetch input automatically"); - } - - run_all(); -} - -fn run_all() { - let years_to_run = [2023, 2024]; - - if env::var("ADVENT_TOKEN").is_ok() { - for year in years_to_run { - for day in 1..=25 { - println!("Pre-fetching input for {year}/{:02}", day); - fetch_input(year, day).expect("Set ADVENT_TOKEN to the correct session cookie to fetch input automatically"); - } - } + if ! Path::new(&format!("./data/{}/day{:02}", year, day)).exists() { + fetch_data(year, day).unwrap(); } - for year in years_to_run { - for day in 1..=25 { - for part in [1, 2] { - let input = load_actual(year, day).unwrap_or_else(|_| panic!("Missing input for {}/{:02}", year, day)); - - let now = Instant::now(); - let result = solution(&input, year, day, part).unwrap_or_else(|| panic!("No solution at {}/{:02}", year, day)); - let time_passed = now.elapsed().as_millis(); - println!("Running Year {}, Day {:02}, Part {} - Result {} - took {}ms", year, day, part, result, time_passed); - } - } - } + let Ok(data) = load_actual(year, day) + else { panic!("No Input Data"); }; + + let now = Instant::now(); + + let part1 = solution(&data, year, day, 1).unwrap(); + + let elapsed1 = now.elapsed(); + + let now = Instant::now(); + + let part2 = solution(&data, year, day, 2).unwrap(); + + let elapsed2 = now.elapsed(); + + println!("Part 1 result is {}, took {}ms", part1, elapsed1.as_millis()); + println!("Part 2 result is {}, took {}ms", part2, elapsed2.as_millis()); + +} + +fn fetch_data(year: usize, day: usize) -> Result<(), Box> { + let url = format!("https://adventofcode.com/{year}/day/{day}/input"); + let session_cookie = env::var("ADVENT_TOKEN")?; + + let jar = reqwest::cookie::Jar::default(); + jar.add_cookie_str(&format!("session={session_cookie}; Domain=.adventofcode.com"), &"https://adventofcode.com".parse::().unwrap()); + + let client = Client::builder().cookie_provider(Arc::new(jar)).build().unwrap(); + let response = client + .get(url) + .send()?; + + let body = response.text()?; + + let path = format!("./data/{}/day{:02}", year, day); + + let mut output = File::create(path)?; + + output.write_all(body.as_bytes())?; + + Ok(()) } diff --git a/src/solution.rs b/src/solution.rs index 76cc7ed..98b3843 100644 --- a/src/solution.rs +++ b/src/solution.rs @@ -3,7 +3,7 @@ use shared::Answer; pub fn solution(input: &str, year: usize, day: usize, part: usize) -> Option { match year { - 2023 => aoc2023::solution(input, day, part), + 2023 => aoc2024::solution(input, day, part), 2024 => aoc2024::solution(input, day, part), _ => None, }