commit 570172f32feed25848a9512c7872ffa88c85c9fa Author: Kevin Cotugno Date: Mon Dec 3 20:03:31 2018 -0800 Challenge one diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53eaa21 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +**/*.rs.bk diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..14307b3 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "AoC-2018" +version = "0.1.0" + diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..057ac0f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "AoC-2018" +version = "0.1.0" +authors = ["Kevin Cotugno "] + +[[bin]] +name = "AoC-2018" +path = "src/bin/main.rs" + +[lib] +name = "aoc" +path = "src/aoc/lib.rs" + +[dependencies] diff --git a/input/01.txt b/input/01.txt new file mode 100644 index 0000000..1536c79 --- /dev/null +++ b/input/01.txt @@ -0,0 +1,1018 @@ +-9 ++7 ++5 +-13 ++6 ++14 +-5 +-10 +-10 +-12 ++2 ++5 ++2 +-6 +-12 ++1 ++13 ++5 ++3 +-15 +-12 ++4 +-11 ++10 +-5 +-14 +-6 ++2 +-9 +-18 ++8 +-1 ++12 ++9 ++5 +-9 ++14 ++3 +-4 +-16 ++14 ++14 ++13 +-7 +-19 ++12 +-9 ++5 ++21 +-7 ++19 +-2 ++14 ++18 ++17 ++4 ++11 +-16 +-5 +-6 +-7 +-2 +-1 +-2 +-1 ++14 +-17 ++5 ++13 ++8 +-6 ++15 ++2 ++16 +-7 +-6 ++11 ++10 ++17 ++13 +-7 ++17 +-18 ++2 ++8 +-17 ++16 ++4 ++7 ++4 +-10 +-10 ++8 ++16 +-13 +-19 +-12 +-12 ++10 +-5 ++21 +-12 +-17 ++6 +-19 ++18 +-10 ++3 +-19 ++7 ++16 +-12 ++6 ++15 +-4 ++9 ++5 ++17 +-16 +-4 +-8 ++2 ++8 ++5 +-6 ++9 ++2 ++17 ++15 +-6 ++9 ++18 ++6 ++18 +-5 +-3 ++17 ++7 +-10 +-5 ++4 +-6 ++3 +-12 +-15 +-16 +-16 ++18 ++16 +-14 +-9 ++12 +-13 +-2 ++5 ++16 +-15 ++7 ++9 ++8 +-11 +-8 +-15 ++13 ++11 ++18 +-15 +-5 ++10 ++14 +-13 ++16 ++2 ++19 ++17 ++17 +-12 ++17 ++8 +-4 +-12 +-11 +-12 +-4 ++15 ++5 ++9 +-18 +-14 +-8 ++13 ++19 ++2 +-11 ++5 ++5 +-3 ++6 ++9 ++12 ++19 +-15 +-12 +-6 ++22 ++2 +-4 ++16 +-11 ++18 ++6 ++14 ++1 +-3 +-10 ++6 +-10 ++12 ++7 ++1 +-11 ++13 +-17 ++19 ++16 ++1 +-12 +-14 ++8 ++16 +-11 ++10 ++7 ++5 +-6 ++5 ++8 ++2 +-4 ++8 ++5 +-10 ++7 ++5 ++4 ++13 ++15 ++12 ++12 +-14 ++6 +-12 ++2 +-8 ++16 ++5 ++10 ++18 +-2 ++16 ++2 +-11 +-13 ++19 ++9 ++12 ++18 ++14 ++17 ++9 +-13 ++25 +-27 ++18 ++4 ++16 ++5 +-15 ++13 ++15 +-16 ++12 ++23 +-12 +-8 +-19 +-10 ++24 ++16 ++6 +-15 ++26 +-16 +-13 ++7 ++25 ++12 ++19 ++14 ++16 +-5 +-12 +-22 +-17 +-20 +-6 +-32 +-2 +-18 +-10 +-11 +-26 ++10 +-17 +-8 +-17 +-8 ++9 +-16 +-14 +-19 ++17 ++19 ++2 ++20 ++19 +-13 +-7 ++19 +-14 +-15 +-5 ++3 +-19 +-6 +-11 +-2 ++15 ++13 +-8 +-12 +-22 +-9 +-14 ++15 +-17 +-1 +-13 ++9 ++17 ++15 +-7 ++13 ++2 ++15 +-6 ++17 ++14 ++8 ++24 +-19 +-10 ++26 +-31 +-18 +-9 ++11 +-15 ++20 ++22 ++2 ++20 ++18 ++10 +-16 +-20 +-32 ++27 ++33 +-12 +-13 ++14 +-20 +-80 +-11 ++6 +-19 +-13 +-5 +-9 ++5 ++13 +-8 +-17 +-14 +-10 +-16 +-5 +-11 ++6 ++6 +-9 +-13 +-4 +-20 ++13 ++3 ++15 ++4 ++18 ++3 +-13 +-7 ++11 +-20 +-6 ++18 ++13 +-23 ++13 +-17 +-18 +-5 ++7 ++8 +-13 +-23 +-18 ++14 ++2 ++7 +-1 ++5 +-16 +-15 ++7 +-8 ++10 +-16 +-10 +-22 ++3 ++18 ++8 +-6 +-4 ++7 ++24 +-8 +-22 ++27 ++15 ++1 +-14 +-47 +-22 +-10 ++48 +-56 +-41 +-9 ++73 ++79 +-9 ++48 +-11 ++36 ++6 +-16 ++20 ++10 ++13 +-20 ++12 ++9 ++3 ++4 ++9 +-12 ++15 ++2 ++19 ++8 ++16 ++13 +-19 +-23 ++10 +-18 ++12 ++20 ++3 ++12 +-17 +-8 ++20 ++3 ++8 ++2 +-17 +-13 +-18 +-8 +-28 ++7 ++1 ++4 +-1 +-29 ++131 +-4 ++8 +-27 +-32 ++14 +-16 +-10 +-77 +-31 ++160 +-115 +-130 +-103 ++930 ++75389 +-16 +-5 ++4 ++8 ++2 +-7 ++6 ++7 ++11 +-8 ++4 +-3 +-5 ++13 ++7 +-5 ++7 +-5 +-1 ++11 ++18 ++19 +-18 ++7 +-14 ++2 +-5 ++12 ++11 ++15 +-17 +-6 ++17 ++3 +-4 ++9 ++16 +-13 ++2 ++19 +-7 +-3 ++18 ++20 +-11 ++13 ++3 ++4 +-2 ++14 ++9 +-17 ++2 ++8 +-5 +-8 ++2 ++10 ++17 ++2 ++15 +-1 +-11 ++13 +-9 +-5 +-19 +-18 +-16 +-14 +-7 +-13 +-11 +-10 ++15 ++7 ++18 +-12 +-9 +-16 ++3 +-14 +-1 ++16 +-9 +-12 +-19 ++1 +-5 +-15 +-14 +-7 ++17 +-1 +-19 +-9 ++6 ++12 +-21 +-20 +-11 +-6 ++8 ++5 ++10 +-2 ++12 +-13 ++6 ++12 +-10 ++13 +-6 ++19 +-3 +-22 +-18 +-4 +-3 ++20 ++10 +-3 +-19 +-9 ++6 +-7 +-13 +-18 +-18 +-3 ++10 +-13 +-14 +-6 ++9 ++20 ++5 ++5 ++16 ++14 ++14 +-19 +-19 ++11 ++10 +-14 +-17 +-19 +-6 +-11 +-13 +-1 +-18 +-14 ++10 +-8 ++1 ++1 ++15 ++8 +-15 ++6 +-9 ++2 ++12 ++13 +-7 +-5 +-19 +-6 +-1 +-19 +-12 +-1 +-4 +-6 +-16 ++2 +-20 +-15 ++5 ++9 +-19 ++12 ++9 +-15 +-5 +-12 +-6 +-12 +-11 ++13 +-11 +-9 +-2 +-16 +-17 +-9 ++16 ++20 ++5 ++20 +-7 +-6 ++4 +-12 +-1 +-5 +-22 +-19 ++10 +-9 +-4 +-5 +-8 +-11 +-18 +-13 ++20 ++1 +-12 ++7 +-19 ++10 +-8 ++13 +-7 +-19 +-15 +-2 ++7 +-18 +-14 ++2 ++15 +-6 +-20 +-10 ++20 ++3 +-19 +-19 +-22 +-14 ++7 ++10 +-15 +-12 +-18 +-7 +-20 +-12 ++1 ++14 ++13 +-8 +-1 +-10 +-13 ++9 ++11 ++7 ++18 +-4 ++6 +-3 ++20 ++18 +-14 +-3 ++11 ++15 ++8 +-9 ++28 ++15 ++13 ++14 ++4 +-13 +-1 +-14 +-5 +-20 ++16 ++10 ++11 ++32 ++23 ++18 ++3 ++3 +-12 ++4 ++11 ++14 ++17 ++2 ++6 +-5 ++19 ++12 ++17 +-15 +-10 +-15 +-5 +-17 ++20 ++20 +-14 ++23 +-14 ++26 +-11 ++9 ++21 ++4 ++16 +-4 ++5 +-11 +-8 +-10 +-5 ++14 +-2 +-4 ++12 +-10 ++16 ++1 ++12 ++1 +-2 +-17 ++10 ++21 +-9 ++15 +-9 ++14 ++3 +-1 ++5 ++19 ++10 +-7 +-10 +-13 ++14 +-2 ++16 ++10 +-1 +-20 ++9 +-8 +-9 +-19 ++18 ++3 +-18 ++11 +-1 +-5 ++21 ++22 ++4 +-11 ++6 ++18 +-8 ++10 ++12 +-19 +-5 ++25 ++5 +-12 +-12 ++3 ++14 ++15 ++4 ++6 ++19 ++18 ++7 +-16 +-1 +-13 +-6 +-1 ++11 +-7 ++13 +-15 +-5 ++13 ++21 +-3 +-14 +-8 +-16 ++13 ++2 +-9 +-18 ++21 +-20 +-20 ++18 +-19 +-22 ++20 +-3 +-4 +-9 +-8 +-20 ++1 +-21 +-4 +-9 +-1 ++18 +-7 ++10 ++20 +-16 ++23 ++17 ++9 +-19 +-3 ++9 ++5 ++2 +-25 ++1 +-15 +-55 +-13 +-10 +-11 ++1 +-14 +-12 ++23 ++15 ++15 +-2 ++19 +-7 +-6 ++10 ++12 ++1 ++8 +-51 ++28 ++24 +-98 ++16 +-3 +-5 +-13 +-37 ++6 +-14 ++9 +-12 +-6 +-23 ++16 +-12 +-10 ++3 ++41 ++4 ++20 +-13 +-5 +-1 +-64 +-30 +-11 +-23 +-46 +-27 +-11 +-75223 diff --git a/src/aoc/c01.rs b/src/aoc/c01.rs new file mode 100644 index 0000000..18f5e3d --- /dev/null +++ b/src/aoc/c01.rs @@ -0,0 +1,75 @@ +use std::collections::HashSet; + +pub fn run(input: &[String], part: u8) -> String { + let encoded: Vec<_> = input.iter().map(|i| i.parse::().unwrap()).collect(); + match part { + 1 => c_01_1(&encoded), + 2 => c_01_2(&encoded), + _ => panic!("unknown part"), + }.to_string() +} + +fn c_01_1(input: &[i32]) -> i32 { + let mut n = 0; + for x in input { + n += x; + } + n +} + +fn c_01_2(input: &[i32]) -> i32 { + let mut freq = HashSet::new(); + freq.insert(0); + let mut n = 0; + loop { + for x in input { + n += x; + if freq.contains(&n) { + return n; + } else { + freq.insert(n); + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + + #[test] + fn c_01_1_examples() -> Result<(), String> { + let mut examples: HashMap<&[i32], i32> = HashMap::new(); + examples.insert(&[1, 1, 1], 3); + examples.insert(&[1, 1, -2], 0); + examples.insert(&[-1, -2, -3], -6); + + for (input, out) in examples.iter() { + let actual = c_01_1(input); + if &actual != out { + return Err(format!("Got: {}, Want: {}", actual, out)); + } + } + + Ok(()) + } + + #[test] + fn c_01_2_examples() -> Result<(), String> { + let mut examples: HashMap<&[i32], i32> = HashMap::new(); + examples.insert(&[1, -1], 0); + examples.insert(&[3, 3, 4, -2, -4], 10); + examples.insert(&[-6, 3, 8, 5, -6], 5); + examples.insert(&[7, 7, -2, -7, -4], 14); + + for (input, out) in examples.iter() { + let actual = c_01_2(input); + if &actual != out { + return Err(format!("Got: {}, Want: {}", actual, out)); + } + } + + Ok(()) + } +} diff --git a/src/aoc/lib.rs b/src/aoc/lib.rs new file mode 100644 index 0000000..f88eb73 --- /dev/null +++ b/src/aoc/lib.rs @@ -0,0 +1,8 @@ +mod c01; + +pub fn run(input: &[String], challenge: u8, part: u8) -> String { + match challenge { + 1 => c01::run(input, part), + _ => panic!("challenge not implemented"), + } +} diff --git a/src/bin/main.rs b/src/bin/main.rs new file mode 100644 index 0000000..287ab37 --- /dev/null +++ b/src/bin/main.rs @@ -0,0 +1,24 @@ +extern crate aoc; + +use std::env; +use std::fs; + +fn main() { + let mut args = env::args(); + if args.len() < 3 { + eprintln!("not enough args"); + } + + args.next(); + let challenge: u8 = args.next().unwrap().parse().unwrap(); + let part: u8 = args.next().unwrap().parse().unwrap(); + + let lines: Vec = fs::read_to_string(format!("input/{:02}.txt", challenge)) + .unwrap() + .lines() + .filter(|v| !v.trim().is_empty()) + .map(|v| v.to_string()) + .collect(); + + println!("{}", aoc::run(&lines, challenge, part)); +}