diff --git a/src/day1.rs b/src/day1.rs new file mode 100644 index 0000000..a51d58e --- /dev/null +++ b/src/day1.rs @@ -0,0 +1,39 @@ +pub struct Data { + masses: Vec, +} + +impl Data { + pub fn new() -> Data { + Data { masses: Vec::new() } + } + pub fn parse(&mut self, input: String) { + let mut mass: i32; + for line in input.split("\n") { + let sline = line.to_string(); + if sline.len() >= 1 { + mass = sline.parse::().unwrap(); + self.masses.push(mass); + } + } + } + + pub fn compute1(&self) -> i32 { + let mut fuel: i32 = 0; + for mass in self.masses.iter() { + fuel += (mass / 3) - 2; + } + fuel + } + + pub fn compute2(&self) -> i32 { + let mut total: i32 = 0; + for mass in self.masses.iter() { + let mut fuel = mass / 3 - 2; + while fuel > 0 { + total += fuel; + fuel = fuel / 3 - 2; + } + } + total + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..3ed5574 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,32 @@ +use std::fs::File; +use std::io::Read; + +mod day1; +mod tests; + +fn main() { + match read_file("../day1.txt") { + Ok(input) => { + let mut data = day1::Data::new(); + data.parse(input); + println!("Day1 Challenge1 result = {}", data.compute1()); + println!("Day1 Challenge2 result = {}", data.compute2()); + } + Err(msg) => { + println!("Error: {}", msg); + } + } +} + +fn read_file(filename: &str) -> Result { + match File::open(filename) { + Ok(mut file) => { + let mut input = String::new(); + match file.read_to_string(&mut input) { + Ok(_) => Ok(input), + Err(msg) => Err(msg), + } + } + Err(msg) => Err(msg), + } +} diff --git a/src/tests.rs b/src/tests.rs new file mode 100644 index 0000000..0c6b6bf --- /dev/null +++ b/src/tests.rs @@ -0,0 +1,91 @@ +use super::*; + +#[test] +fn day1_11() { + let input = String::from("12"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute1(); + assert_eq!(res, 2); +} + +#[test] +fn day1_12() { + let input = String::from("14"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute1(); + assert_eq!(res, 2); +} + +#[test] +fn day1_13() { + let input = String::from("12\n14"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute1(); + assert_eq!(res, 4); +} + +#[test] +fn day1_14() { + let input = String::from("1969"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute1(); + assert_eq!(res, 654); +} + +#[test] +fn day1_15() { + let input = String::from("100756"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute1(); + assert_eq!(res, 33583); +} + +#[test] +fn day1_21() { + let input = String::from("12"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute2(); + assert_eq!(res, 2); +} + +#[test] +fn day1_22() { + let input = String::from("14"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute2(); + assert_eq!(res, 2); +} + +#[test] +fn day1_23() { + let input = String::from("12\n14"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute2(); + assert_eq!(res, 4); +} + +#[test] +fn day1_24() { + let input = String::from("1969"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute2(); + assert_eq!(res, 966); +} + +#[test] +fn day1_25() { + let input = String::from("100756"); + let mut d1 = day1::Data::new(); + d1.parse(input); + let res = d1.compute2(); + assert_eq!(res, 50346); +}