diff --git a/Cargo.lock b/Cargo.lock index 4d33b98..3a8d771 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,9 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aoc2015" +version = "0.1.0" + [[package]] name = "aoc2018" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index b8bf296..fd918d1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "aoc2015", "aoc2018", "aoc2019", ] diff --git a/aoc2015/Cargo.toml b/aoc2015/Cargo.toml new file mode 100644 index 0000000..12a9c19 --- /dev/null +++ b/aoc2015/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "aoc2015" +version = "0.1.0" +authors = ["Antoine Martin "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/aoc2015/input/day01.txt b/aoc2015/input/day01.txt new file mode 100644 index 0000000..becde71 --- /dev/null +++ b/aoc2015/input/day01.txt @@ -0,0 +1 @@ +((((()(()(((((((()))(((()((((()())(())()(((()((((((()((()(()(((()(()((())))()((()()())))))))))()((((((())((()))(((((()(((((((((()()))((()(())()((())((()(()))((()))()))()(((((()(((()()))()())((()((((())()())()((((())()(()(()(((()(())(()(())(((((((())()()(((())(()(()(()(())))(()((((())((()))(((()(()()(((((()()(()(((()(((((())()))()((()(()))()((()((((())((((())(()(((())()()(()()()()()(())((((())((())(()()))()((((())))((((()())()((((())((()())((())(())(((((()((((()(((()((((())(()(((()()))()))((((((()((())()())))(((()(()))(()()(()(((()(()))((()()()())((()()()(((())())()())())())((()))(()(()))(((((()(()(())((()(())(())()((((()())()))((((())(())((())())((((()(((())(())((()()((((()((((((()(())()()(()(()()((((()))(())()())()))(())))(())))())()()(())(()))()((()(()(())()()))(()())))))(()))(()()))(())(((((()(()(()()((())()())))))((())())((())(()(())((()))(())(((()((((((((()()()(()))()()(((()))()((()()(())(())())()(()(())))(((((()(())(())(()))))())()))(()))()(()(((((((()((((())))())())())())()((((((((((((((()()((((((()()()())())()())())())(())(())))())((()())((()(()))))))()))))))))))))))))())((())((())()()))))))(((()((()(()()))((())(()()))()()())))(())))))))(()(((())))())()())))()()(())()))()(()))())((()()))))(()))))()))(()()(())))))))()(((()))))()(()))(())())))))()))((()))((()))())(())))))))))((((())()))()))()))())(())()()(())))())))(()())()))((()()(())))(())((((((()(())((()(((()(()()(())))()))))))()))()(()((()))()(()))(()(((())((((())())(())(()))))))))())))))))())())))))())))))()()(((())()(()))))))))())))))(())()()()))()))()))(()(())()()())())))))))())()(()(()))))()()()))))())(()))))()()))))()())))))(((())()()))(()))))))))))()()))))()()()))))(()())())()()())()(()))))()(()))(())))))))(((((())(())())()()))()()))(())))))()(()))))(())(()()))()())()))()))()))()))))())()()))())())))(()))(()))))))())()(((())()))))))))()))()())))())))())))()))))))))))()()))(()()))))))(())()(()))))())(()))))(()))))(()())))))())())()()))))())()))))))))(()))))()))))))()(()())))))))()))())))())))())))())))))))())(()()))))))(()())())))()())()))))))))))))))())))()(())))()))())()()(())(()()))(())))())()())(()(()(()))))())))))))))))())(()))()))()))))(())()())()())))))))))))()()))))))))))))())())))))(()())))))))))))())(())))()))))))))())())(()))()))(())))()))()()(())()))))))()((((())()))())())))))()))()))))((()())()))))())))(())))))))))))))))))()))))()()())()))()()))))())()))((()())))())))(()))(()())))))))()))()))))(())))))))(())))))())()()(()))())()))()()))))())()()))))())()))())))))))(()))))()())()))))))))(()))())))(()))()))))(())()))())())(())())())))))))((((())))))()))()))()())()(())))()))()))()())(()())()()(()())()))))())())))))(()))()))))())(()()(())))))(())()()((())())))))(())(())))))))())))))))))()(())))))))()())())())()(()))))))))(()))))))))())()()))()(()))))))()))))))())))))))(())))()()(())()())))))(((())))()((())()))())))(()()))())(())())))()(((()())))))()(()()())))()()(()()(()()))())()(()()()))())()()))()())(()))))())))))())))(())()()))))(()))))(())(()))(())))))()()))()))))())()))()()(())())))((()))())()))))))()()))))((()(()))))()()))))))())))))())(()((()())))))))))))()())())))()))(()))))))(()))(())()())))(()))))))))())()()()()))))(()())))))))((())))()))(()))(())(())()())()))))))))(())))())))(()))()()))(()()))(()))())))()(())))())((()((()(())))((())))()))))((((())())()())))(())))()))))))())(()()((())))())()(()())))))(()())()))())))))))((())())))))))(()(()))())()()(()()(((()(((()())))))()))))))()(())(()()((()()(())()()))())()())()))()())())())))))))(((())))))))()()))))))(((())()))(()()))(()()))))(()(()()((((())()())((()()))))(()(())))))()((()()()())()()((()((()()))(()))(((()()()))(((())))()(((())()))))))((()(())())))(()())(((((()(()))(()((()))(()())()))))(()(()))()(()))(())(((())(()()))))()()))(((()))))(()()()()))())))((()()()(())()))()))))()()))()))))))((((((()()()))))())((()()(((()))))(()(())(()()())())())))()(((()()))(())((())))(()))(()()()())((())())())(()))))()))()((()(())()(()()(())(()))(())()))(())(()))))(())(())())(()()(()((()()((())))((()))()((())))(((()()()()((((()))(()()))()()()(((())((())())(()()(()()()))()((())(())()))())(((()()(())))()((()()())()())(()(())())(((())(())())((())(())()(((()()))(())))((())(()())())(())((()()()((((((())))((()(((((())()))()))(())(()()))()))(())()()))(())((()()())()()(()))())()((())))()((()()())((((()())((())())())((()((()))()))((())((()()(()((()()(((())(()()))))((()((())()(((())(()((())())((())(()((((((())())()(()())()(())(((())((((((()(())(()((()()()((()()(()()()())))()()(((((()()))()((((((()))()(()(()(()(((()())((()))())()((()))(())))()))()()))())()()))())((((())(()(()))(((((((())(((()(((((()(((()()((((())(((())())))(()()()(()(()))()))((((((()))((()(((()(())((()((((()((((((())(((((())))(((()(()))))(((()(((())()((())(()((()))(((()()(((())((((()(()(((((()))(((()(((((((()(()()()(()(()(()()())(())(((((()(())())()())(()(()(()))()(()()()())(()()(()((()))()((())())()(()))((())(()))()(()))()(((()(()(()((((((()()()()())()(((((()()(((()()()((()(((((()))((((((((()()()(((((()))))))(()()()(())(()))(()()))))(())()))(((((()(((((()()(()(()())(((()))((((()((()(()(()((()(()((())))()(((()((()))((()))(((((((((()((()((()(())))()((((()((()()))((())(((()(((((()()(()(()()((()(()()()(((((((())())()())))))((((()()(()))()))(()((())()(()(((((((((()()(((()(()())(()((()())((())())((((()(((()(((()((((()((()((((()(()((((((())((((((((((((()()(()()((((((((((((((()((()()))()((((((((((((())((((()(()())((()(()(()))()(((((()()(((()()))()())(())((()(((((()((())(((((()((()(((((()))()()((((())()((((())(((((((((()(())(()(())))())(()((())(((())(())(())())(()(()(())()()((()((())()(((()(((((()(())))()(((()((())))((()()()(((()(((()((()(()(())(()((()())(()(()(((()(((((((((())(()((((()()))(()((((()()()()(((()((((((((()(()()((((((()(()()(()((()((((((((((()()(((((((()())(())))(((()()))(((((()((()()())(()()((((())((()((((()))))(())((()(()()(((()(()(((()((((()(((((()))())())(()((())()))(((()())((())((())((((()((()((((((())(()((((()()))((((((())()(()))((()(((())((((((((((()()(((((()(((((()((()()()((((())))(()))()((()(())()()((()((((((((((()((())(())(((((()(()(()()))((((()((((()()((()(((()(((((((((()(()((()((()))((((((()(((())()()((()(((((((()())))()()(()((()((()()(((()(()()()()((((()((())((((()(((((((((()(((()()(((()(()(((()(((()((())()(()((()(()(()(()))()(((()))(()((((()((())((((())((((((())(()))(()((((())((()(()((((((((()()((((((()(()(()()()(())((()((()()(((()(((((((()()((()(((((((()))(((((()(((()(()()()(()(((()((()()((())(()(((((((((()(()((()((((((()()((())()))(((((()((())()())()(((((((((((()))((((()()()()())(()()(()(()()))()))(()))(()(((()()))())(()(()))()()((())(()())()())()(()))()))(()()(()((((((())((()(((((((((((()(())()((()(()((()((()(()((()((((((((((()()())((())()(())))((())()())()(((((()(()())((((()((()(())(()))(((())()((()))(((((())(()))()()(()))(((())((((()((((()(())))(((((((()))))())()())(())((())()(()()((()(()))()(()()(()()((()())((())((()()))((((()))()()))(()()(())()()(((((()(())((()((((()))()))(()())())(((()()(()()))(())))))(()))((())(((((()((((()))()((((()))()((())(((())))(((()())))((()(()()(( diff --git a/aoc2015/src/day01.rs b/aoc2015/src/day01.rs new file mode 100644 index 0000000..d21a03f --- /dev/null +++ b/aoc2015/src/day01.rs @@ -0,0 +1,81 @@ +use std::error::Error; + +use super::err; +use super::Result; + +const INPUT: &str = include_str!("../input/day01.txt"); + +pub fn run() -> Result<()> { + println!("part 1: {}", part1(INPUT)?); + println!("part 2: {}", part2(INPUT)?); + + Ok(()) +} + +fn part1(input: &str) -> Result { + Ok(input + .chars() + .filter_map(|c| match c { + '(' => Some(1), + ')' => Some(-1), + _ => None, + }) + .sum()) +} + +fn part2(input: &str) -> Result { + let mut sum = 0; + let mut res = 0; + + for (i, c) in input.chars().enumerate() { + match c { + '(' => sum += 1, + ')' => sum -= 1, + _ => return Err(err!("unidentified character in input: {}", c)), + }; + + if sum < 0 { + res = i + 1; + break; + } + } + + match res { + 0 => Err(err!("never reached the basement...")), + _ => Ok(res), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_provided() { + assert_eq!(part1("(())").unwrap(), 0); + assert_eq!(part1("()()").unwrap(), 0); + assert_eq!(part1("(((").unwrap(), 3); + assert_eq!(part1("(()(()(").unwrap(), 3); + assert_eq!(part1("))(((((").unwrap(), 3); + assert_eq!(part1("())").unwrap(), -1); + assert_eq!(part1("))(").unwrap(), -1); + assert_eq!(part1(")))").unwrap(), -3); + assert_eq!(part1(")())())").unwrap(), -3); + } + + #[test] + fn part1_real() { + assert_eq!(part1(INPUT).unwrap(), 74); + } + + #[test] + fn part2_provided() { + assert_eq!(part2(")").unwrap(), 1); + assert_eq!(part2("()())").unwrap(), 5); + } + + #[test] + fn part2_real() { + assert_eq!(part2(INPUT).unwrap(), 1795); + } +} diff --git a/aoc2015/src/lib.rs b/aoc2015/src/lib.rs new file mode 100644 index 0000000..656543d --- /dev/null +++ b/aoc2015/src/lib.rs @@ -0,0 +1,8 @@ +pub mod day01; + +pub type Result = std::result::Result>; + +#[macro_export] +macro_rules! err { + ($($string:expr),+) => (Box::::from(format!($($string),+))) +} diff --git a/aoc2015/src/main.rs b/aoc2015/src/main.rs new file mode 100644 index 0000000..3f01406 --- /dev/null +++ b/aoc2015/src/main.rs @@ -0,0 +1,29 @@ +use std::env; + +use aoc2015::day01; + +use aoc2015::Result; + +fn main() -> Result<()> { + let days: &[fn() -> Result<()>] = &[day01::run]; + + let mut args = env::args(); + args.next(); + + match args.next() { + Some(arg) => { + let day: usize = arg.parse().expect("Please provide a day number"); + days[day - 1]().expect("error running day specified"); + } + None => { + for (i, day) in days.iter().enumerate() { + let i = i + 1; + println!("day{}: ", i); + day().unwrap_or_else(|e| panic!("error running day {}: {}", i, e)); + println!(); + } + } + } + + Ok(()) +}