From ab6092382192bf54f113d029e085e20a79cce779 Mon Sep 17 00:00:00 2001 From: Jonas Berlin Date: Sat, 31 Jul 2021 16:29:05 +0300 Subject: pwc123 --- challenge-123/xkr47/rust/Cargo.lock | 7 +++++ challenge-123/xkr47/rust/Cargo.toml | 15 +++++++++++ challenge-123/xkr47/rust/ch-1.rs | 53 +++++++++++++++++++++++++++++++++++++ challenge-123/xkr47/rust/ch-2.rs | 39 +++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 challenge-123/xkr47/rust/Cargo.lock create mode 100644 challenge-123/xkr47/rust/Cargo.toml create mode 100644 challenge-123/xkr47/rust/ch-1.rs create mode 100644 challenge-123/xkr47/rust/ch-2.rs diff --git a/challenge-123/xkr47/rust/Cargo.lock b/challenge-123/xkr47/rust/Cargo.lock new file mode 100644 index 0000000000..ec844e7b4d --- /dev/null +++ b/challenge-123/xkr47/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "pwd-123" +version = "0.1.0" diff --git a/challenge-123/xkr47/rust/Cargo.toml b/challenge-123/xkr47/rust/Cargo.toml new file mode 100644 index 0000000000..5213a81782 --- /dev/null +++ b/challenge-123/xkr47/rust/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "pwd-123" +version = "0.1.0" +authors = ["Jonas Berlin "] +edition = "2018" + +[dependencies] + +[[bin]] +name = "ch-1" +path = "ch-1.rs" + +[[bin]] +name = "ch-2" +path = "ch-2.rs" diff --git a/challenge-123/xkr47/rust/ch-1.rs b/challenge-123/xkr47/rust/ch-1.rs new file mode 100644 index 0000000000..7ec77ca91a --- /dev/null +++ b/challenge-123/xkr47/rust/ch-1.rs @@ -0,0 +1,53 @@ +#![allow(dead_code)] + +use std::env; + +fn main() { + let n = env::args().nth(1).expect("Missing argument n").parse().expect("Bad argument n"); + + let num = nth_ugly_number(n); + + println!("{}", num); +} + +fn nth_ugly_number(n: usize) -> usize { + (1..) + .filter(|i| is_ugly(*i)) + .nth(n - 1) + .unwrap() +} + +fn is_ugly(mut n: usize) -> bool { + n = divide_all(n, 5); + n = divide_all(n, 3); + n = divide_all(n, 2); + n == 1 +} + +fn divide_all(n: usize, div: usize) -> usize { + let l = if div == 2 { (n as f64).log2() } else { (n as f64).log(div as f64) } as u32; + (1..=l) + .rev() + .map(|k| div.pow(k)) + .filter(|kp| n % kp == 0) + .map(|kp| n / kp) + .next() + .unwrap_or(n) +} + +#[cfg(test)] +mod tests { + use crate::*; + + // from assignment + + #[test] + fn do_test1() { + assert_eq!(nth_ugly_number(7), 8); + } + + #[test] + fn do_test2() { + assert_eq!(nth_ugly_number(10), 12); + } +} diff --git a/challenge-123/xkr47/rust/ch-2.rs b/challenge-123/xkr47/rust/ch-2.rs new file mode 100644 index 0000000000..1bd2f372c7 --- /dev/null +++ b/challenge-123/xkr47/rust/ch-2.rs @@ -0,0 +1,39 @@ +#![allow(dead_code)] + +use std::env; + +fn main() { + let args = env::args().skip(1).take(8).map(|i| i.parse::().unwrap()).collect::>(); + assert_eq!(args.len(), 8, "Wrong number of arguments, expected 8"); + + let sq = is_square([(args[0], args[1]), (args[2], args[3]), (args[4], args[5]), (args[6], args[7])]); + + println!("{}", sq); +} + +fn is_square(c: [(i32, i32); 4]) -> i8 { + let vx1 = c[1].0 - c[0].0; + let vy1 = c[1].1 - c[0].1; + let vx2 = c[2].0 - c[0].0; + let vy2 = c[2].1 - c[0].1; + let vx3 = c[3].0 - c[0].0; + let vy3 = c[3].1 - c[0].1; + if vx1 + vx3 == vx2 && vy1 + vy3 == vy2 { 1 } else { 0 } +} + +#[cfg(test)] +mod tests { + use crate::*; + + // from assignment + + #[test] + fn do_test1() { + assert_eq!(is_square([(10, 20), (20, 20), (20, 10), (10, 10)]), 1); + } + + #[test] + fn do_test2() { + assert_eq!(is_square([(12, 24), (16, 10), (20, 12), (18, 16)]), 0); + } +} -- cgit