aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-07-31 21:06:08 +0100
committerGitHub <noreply@github.com>2021-07-31 21:06:08 +0100
commite085ac67c613bb3c258715dd344b6c0c86c83626 (patch)
tree535eafe36a650711539c998c7bb7424d3fc96ee5
parent65a2ff6db1e19cc1bd28f2f73aa9b44336a80256 (diff)
parentab6092382192bf54f113d029e085e20a79cce779 (diff)
downloadperlweeklychallenge-club-e085ac67c613bb3c258715dd344b6c0c86c83626.tar.gz
perlweeklychallenge-club-e085ac67c613bb3c258715dd344b6c0c86c83626.tar.bz2
perlweeklychallenge-club-e085ac67c613bb3c258715dd344b6c0c86c83626.zip
Merge pull request #4632 from xkr47/pwc123
pwc123
-rw-r--r--challenge-123/xkr47/rust/Cargo.lock7
-rw-r--r--challenge-123/xkr47/rust/Cargo.toml15
-rw-r--r--challenge-123/xkr47/rust/ch-1.rs53
-rw-r--r--challenge-123/xkr47/rust/ch-2.rs39
4 files changed, 114 insertions, 0 deletions
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 <xkr47@outerspace.dyndns.org>"]
+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::<i32>().unwrap()).collect::<Vec<_>>();
+ 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);
+ }
+}