diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/Rust-Programming.iml b/.idea/Rust-Programming.iml
new file mode 100644
index 0000000..78c56dd
--- /dev/null
+++ b/.idea/Rust-Programming.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..639900d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..8d670ec
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/duplicates/src/main.rs b/duplicates/src/main.rs
index 355e4cd..a55267a 100644
--- a/duplicates/src/main.rs
+++ b/duplicates/src/main.rs
@@ -1,19 +1,123 @@
+/**
+ * _ _ _ _
+ * __ ___ __(_) |_| |_ ___ _ __ | |__ _ _
+ * \ \ /\ / / '__| | __| __/ _ \ '_ \ | '_ \| | | |
+ * \ V V /| | | | |_| || __/ | | | | |_) | |_| |
+ * \_/\_/ |_| |_|\__|\__\___|_| |_| |_.__/ \__, |
+ * |___/
+ * ____ __ __ _
+ * / ___|_ _____ _ __ \ \ / /__ __ _ ___| |
+ * \___ \ \ / / _ \ '_ \ \ \ / / _ \ / _` |/ _ \ |
+ * ___) \ V / __/ | | | \ V / (_) | (_| | __/ |
+ * |____/ \_/ \___|_| |_| \_/ \___/ \__, |\___|_|
+ * |___/
+ * Licensed under the GPLv2 License, Version 2.0 (the "License");
+ * Copyright (c) Sven Vogel
+ */
+
+use crate::FloatOrChar::{Char, Float};
+use std::collections::{HashMap, HashSet};
+use std::fmt::Debug;
+use std::usize;
+
+/// pretty useless enum that either contains a char or
+/// a f32
+#[derive(Debug)]
+enum FloatOrChar {
+ Float(f64),
+ Char(char),
+}
+
+impl PartialEq for FloatOrChar {
+ /// only returns true if
+ /// self and other of the same enum variant and their wrapped values match
+ fn eq(&self, other: &Self) -> bool {
+ return match self {
+ Float(x) => {
+ if let Float(y) = *other {
+ // compare floats with tolerance
+ (*x - y).abs() < f64::EPSILON
+ } else {
+ false // other is not a Float32
+ }
+ }
+ Char(x) => {
+ if let Char(y) = *other {
+ *x == y
+ } else {
+ false // other is not a Char
+ }
+ }
+ };
+ }
+
+ /// opposite of equals
+ fn ne(&self, other: &Self) -> bool {
+ !self.eq(other)
+ }
+}
+
+/// count all duplicate values in an array
+/// equivalence is determined by the [`PartialEq`] trait
+fn duplicates(arr: &[T]) -> usize
+where
+ T: PartialEq + Debug,
+{
+ let mut total_dups = 0;
-fn duplicates(arr: &[T]) -> usize where T: PartialEq {
- let mut dups = 0;
for x in 0..arr.len() {
let to_cmp = &arr[x];
- for y in (x+1)..arr.len() {
+ let mut count = 0;
+
+ for y in (x + 1)..arr.len() {
if &arr[y] == to_cmp {
- dups += 1;
+ count += 1;
}
}
+
+ total_dups += count;
+
+ if count > 0 {
+ println!("Element {:?} was duplicated {} time(s)", to_cmp, count);
+ }
}
- dups * 2
+
+ total_dups
+}
+
+/// read some data from stdin and stores it into a vector.
+/// the reading of data stops if the input is neither a float nor a single character.
+/// input line are trimmed
+fn read_array() -> Vec {
+ // temporary string buffer for reading
+ let mut buf = String::new();
+ // storage for our parsed array
+ let mut elems = Vec::::new();
+
+ println!("Enter some floats or characters, one per line:");
+
+ loop {
+ // read some characters
+ std::io::stdin().read_line(&mut buf).unwrap();
+
+ // parse the data
+ if let Ok(float) = buf.trim().parse::() {
+ elems.push(Float(float));
+ } else if let Ok(char) = buf.trim().parse::() {
+ elems.push(Char(char));
+ } else {
+ break;
+ }
+
+ // empty string
+ buf.clear();
+ }
+
+ elems
}
fn main() {
- let arr = ['😇', '🙈', '💀', '💦', '💣', '💀'];
+ let arr = &read_array()[..];
println!("Duplicates: {}", duplicates(&arr));
}
diff --git a/fibonacci/src/main.rs b/fibonacci/src/main.rs
index 3737ddb..9551b6e 100644
--- a/fibonacci/src/main.rs
+++ b/fibonacci/src/main.rs
@@ -1,4 +1,21 @@
+/**
+ * _ _ _ _
+ * __ ___ __(_) |_| |_ ___ _ __ | |__ _ _
+ * \ \ /\ / / '__| | __| __/ _ \ '_ \ | '_ \| | | |
+ * \ V V /| | | | |_| || __/ | | | | |_) | |_| |
+ * \_/\_/ |_| |_|\__|\__\___|_| |_| |_.__/ \__, |
+ * |___/
+ * ____ __ __ _
+ * / ___|_ _____ _ __ \ \ / /__ __ _ ___| |
+ * \___ \ \ / / _ \ '_ \ \ \ / / _ \ / _` |/ _ \ |
+ * ___) \ V / __/ | | | \ V / (_) | (_| | __/ |
+ * |____/ \_/ \___|_| |_| \_/ \___/ \__, |\___|_|
+ * |___/
+ * Licensed under the GPLv2 License, Version 2.0 (the "License");
+ * Copyright (c) Sven Vogel
+ */
+/// recursive variant of the fibonacci function
fn fib_rec(x: u128) -> u128 {
if x < 2 {
return x;
@@ -7,11 +24,12 @@ fn fib_rec(x: u128) -> u128 {
return fib_rec(x - 1) + fib_rec(x - 2);
}
+/// iterative variant of the fibonacci function
fn fib_loop(x: u128) -> u128 {
let mut sum = 0;
let mut sum2 = 1;
- for x in 0..(x-1) {
+ for x in 0..(x - 1) {
let t = sum;
sum = sum2;
sum2 = t + sum;
@@ -20,6 +38,5 @@ fn fib_loop(x: u128) -> u128 {
}
fn main() {
-
println!("{}", fib_loop(5));
}
diff --git a/tuple_arithmetic/src/main.rs b/tuple_arithmetic/src/main.rs
index 6e42e8d..64c5249 100644
--- a/tuple_arithmetic/src/main.rs
+++ b/tuple_arithmetic/src/main.rs
@@ -1,4 +1,20 @@
-/* Compressed version:
+/**
+ * _ _ _ _
+ * __ ___ __(_) |_| |_ ___ _ __ | |__ _ _
+ * \ \ /\ / / '__| | __| __/ _ \ '_ \ | '_ \| | | |
+ * \ V V /| | | | |_| || __/ | | | | |_) | |_| |
+ * \_/\_/ |_| |_|\__|\__\___|_| |_| |_.__/ \__, |
+ * |___/
+ * ____ __ __ _
+ * / ___|_ _____ _ __ \ \ / /__ __ _ ___| |
+ * \___ \ \ / / _ \ '_ \ \ \ / / _ \ / _` |/ _ \ |
+ * ___) \ V / __/ | | | \ V / (_) | (_| | __/ |
+ * |____/ \_/ \___|_| |_| \_/ \___/ \__, |\___|_|
+ * |___/
+ * Licensed under the GPLv2 License, Version 2.0 (the "License");
+ * Copyright (c) Sven Vogel
+ *
+ * Compressed version:
*
* type V=(f64,f64);fn t(a:V,b:V,f:fn(
* a:f64,b:f64)->f64)->V{(f(a.0,b.0),f
@@ -6,15 +22,10 @@
* t(t((2.42,2.07),(0.3,3.2),|a,b|{a/b
* }),t((1.7,2.3),(0.73,0.42),|a,b|{a*
* b}),|a,b|{a-b}))}
- *
*/
-
-fn merge_tuple(a: (f64, f64), b: (f64, f64), f: fn (a: f64, b: f64) -> f64) -> (f64, f64) {
- (
- f(a.0, b.0),
- f(a.1, b.1),
- )
+fn merge_tuple(a: (f64, f64), b: (f64, f64), f: fn(a: f64, b: f64) -> f64) -> (f64, f64) {
+ (f(a.0, b.0), f(a.1, b.1))
}
fn add_tuple(a: (f64, f64), b: (f64, f64)) -> (f64, f64) {
@@ -34,5 +45,11 @@ fn div_tuple(a: (f64, f64), b: (f64, f64)) -> (f64, f64) {
}
fn main() {
- println!("{:#?}", sub_tuple(div_tuple((2.42, 2.07), (0.3, 3.2)), mul_tuple((1.7, 2.3), (0.73, 0.42))));
+ println!(
+ "{:#?}",
+ sub_tuple(
+ div_tuple((2.42, 2.07), (0.3, 3.2)),
+ mul_tuple((1.7, 2.3), (0.73, 0.42))
+ )
+ );
}