diff --git a/2019/12/Cargo.toml b/2019/12/Cargo.toml new file mode 100644 index 0000000..13abe5d --- /dev/null +++ b/2019/12/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "day12" +version = "0.1.0" +authors = ["kageru "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +scan_fmt = "0.2.4" diff --git a/2019/12/input b/2019/12/input new file mode 100644 index 0000000..f588984 --- /dev/null +++ b/2019/12/input @@ -0,0 +1,4 @@ + + + + diff --git a/2019/12/src/main.rs b/2019/12/src/main.rs new file mode 100644 index 0000000..b5515ad --- /dev/null +++ b/2019/12/src/main.rs @@ -0,0 +1,63 @@ +#[macro_use] +extern crate scan_fmt; + +#[derive(Debug, PartialEq, Eq)] +struct Moon { + x: i32, + y: i32, + z: i32, + x_vel: i32, + y_vel: i32, + z_vel: i32, +} + +fn main() { + println!("Hello, world!"); +} + +fn gcd(mut x: u32, mut y: u32) -> u32 { + let mut remainder; + while y != 0 { + remainder = x % y; + x = y; + y = remainder; + } + x +} + +fn lcm(x: u32, y: u32) -> u32 { + x * y / gcd(x, y) +} + +#[rustfmt::skip] +fn parse(line: &str) -> Moon { + let (x, y, z) = scan_fmt!(line, "", i32, i32, i32).unwrap(); + Moon { x, y, z, x_vel: 0, y_vel: 0, z_vel: 0, } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_gcd() { + assert_eq!(gcd(20, 10), 10); + assert_eq!(gcd(20, 15), 5); + assert_eq!(gcd(15, 20), 5); + } + + #[test] + fn test_lcm() { + assert_eq!(lcm(20, 10), 20); + assert_eq!(lcm(3, 7), 21); + assert_eq!(lcm(7, 3), 21); + assert_eq!(lcm(lcm(7, 3), 5), 105); + } + + #[test] + #[rustfmt::skip] + fn test_parse() { + assert_eq!(parse(""), Moon { x: -14, y: 9, z: -4, x_vel: 0, y_vel: 0, z_vel: 0 }); + assert_ne!(parse(""), Moon { x: 14, y: 9, z: -4, x_vel: 0, y_vel: 0, z_vel: 0 }); + } +}