Added sorting code
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/target
|
||||
**/*.rs.bk
|
||||
185
Cargo.lock
generated
Normal file
185
Cargo.lock
generated
Normal file
@@ -0,0 +1,185 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
version = "0.2.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ballpit"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "c2-chacha"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "2.33.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.1.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.66"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_hc"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "textwrap"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "vec_map"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[metadata]
|
||||
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||
"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
|
||||
"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb"
|
||||
"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
|
||||
"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407"
|
||||
"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
|
||||
"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
|
||||
"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
|
||||
"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
|
||||
"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
|
||||
"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
|
||||
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
||||
"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
|
||||
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
|
||||
"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
|
||||
"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
|
||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "ballpit"
|
||||
version = "0.1.0"
|
||||
authors = ["Jali <jali@orca-central.de>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
clap = "2.33.0"
|
||||
rand = "0.7"
|
||||
63
src/env/commandlinearguments.rs
vendored
Normal file
63
src/env/commandlinearguments.rs
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
//! File: env/commandlinearguments.rs
|
||||
//! Created On: Thu 26 Dec 2019 09:01:57 PM CET
|
||||
//! Last Modfied: Thu 26 Dec 2019 09:01:57 PM CET
|
||||
//! Author: Jali <jali@orca-central.de>
|
||||
//! Description: Defines the command line arguments that were passed
|
||||
|
||||
use clap::ArgMatches;
|
||||
use std::str::FromStr;
|
||||
|
||||
/**
|
||||
* # Summary
|
||||
* Stores the command line arguments from our
|
||||
* service.
|
||||
*/
|
||||
pub struct CommandLineArguments {
|
||||
pub no_of_balls: u32,
|
||||
}
|
||||
|
||||
impl CommandLineArguments {
|
||||
/**
|
||||
* # Summary
|
||||
* Creates a new instance of a CommandLineArguments object either from
|
||||
* the command line or the default configuration
|
||||
*
|
||||
* # Returns
|
||||
* A new ```CommandLineArguments``` object
|
||||
*
|
||||
* # Examples
|
||||
*
|
||||
* ```rust
|
||||
* let cmdargs = CommandLineArguments::new();
|
||||
* ```
|
||||
*/
|
||||
pub fn new() -> CommandLineArguments {
|
||||
let matches = CommandLineArguments::parse_command_line();
|
||||
|
||||
CommandLineArguments {
|
||||
no_of_balls: FromStr::from_str(matches.value_of("NOOFBALLS").unwrap_or("1000"))
|
||||
.unwrap(),
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* # Summary
|
||||
* Parses the command line and returns all matches that fit valid options.
|
||||
*
|
||||
* # Generics
|
||||
* ## Lifetimeparm: 'a
|
||||
* Assures the same lifetime to the return value than the command line.
|
||||
*
|
||||
* # Returns
|
||||
* An *ArgMatches* struct, that contrains all matched arguments.
|
||||
*/
|
||||
fn parse_command_line<'a>() -> ArgMatches<'a> {
|
||||
clap_app!(myapp =>
|
||||
(version: "1.0.360.1")
|
||||
(author: "Jali <jali@orca-central.de>")
|
||||
(about: "A naïve algorithm to sort balls in a ballpit by colour")
|
||||
(@arg NOOFBALLS: -n --noofballs +takes_value "Specifies the number of balls in the ballpit")
|
||||
)
|
||||
.get_matches()
|
||||
}
|
||||
}
|
||||
9
src/env/mod.rs
vendored
Normal file
9
src/env/mod.rs
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
//! File: env/mod.rs
|
||||
//! Created On: Thu 26 Dec 2019 09:05:17 PM CET
|
||||
//! Last Modfied: Thu 26 Dec 2019 09:05:17 PM CET
|
||||
//! Author: Jali <jali@orca-central.de>
|
||||
//! Description: Defines the command line arguments that were passed
|
||||
mod commandlinearguments;
|
||||
|
||||
// publish the CommandLineArgument struct
|
||||
pub use self::commandlinearguments::CommandLineArguments;
|
||||
19
src/main.rs
Normal file
19
src/main.rs
Normal file
@@ -0,0 +1,19 @@
|
||||
//! File: main.rs
|
||||
//! Created On: Thu 26 Dec 2019 09:11:26 PM CET
|
||||
//! Last Modified: Thu 26 Dec 2019 11:20:32 PM CET
|
||||
//! Description: A naïve algorithm to sort balls in a ball pit.
|
||||
#[macro_use]
|
||||
extern crate clap;
|
||||
extern crate rand;
|
||||
|
||||
mod env;
|
||||
mod sort;
|
||||
|
||||
fn main() {
|
||||
let args = env::CommandLineArguments::new();
|
||||
|
||||
let mut buckets = sort::Buckets::new();
|
||||
buckets.sort(args.no_of_balls);
|
||||
|
||||
println!("The pit is empty");
|
||||
}
|
||||
90
src/sort/ballpit.rs
Normal file
90
src/sort/ballpit.rs
Normal file
@@ -0,0 +1,90 @@
|
||||
//! File: sort/ballpit.rs
|
||||
//! Author: Jali <jali@orca-central.de>
|
||||
//! Create On: Thu 26 Dec 2019 09:55:45 PM CET
|
||||
//! Last Modified: Thu 26 Dec 2019 10:52:30 PM CET
|
||||
//! Description: Simulates a ballpit with a given number of balls.
|
||||
//! The ballpit creates each ball randomly, when a ball is picked,
|
||||
//! and reduces the counter by one.
|
||||
|
||||
use rand::{
|
||||
distributions::{Distribution, Standard},
|
||||
Rng,
|
||||
};
|
||||
use std::fmt;
|
||||
|
||||
/**
|
||||
* Defines the kinds of balls, that are available
|
||||
*/
|
||||
#[derive(Debug)]
|
||||
pub enum Colours {
|
||||
Red,
|
||||
Green,
|
||||
Yellow,
|
||||
Blue,
|
||||
}
|
||||
|
||||
// implements the distribution class for ```Colours```
|
||||
impl Distribution<Colours> for Standard {
|
||||
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Colours {
|
||||
match rng.gen_range(0, 4) {
|
||||
0 => Colours::Red,
|
||||
1 => Colours::Green,
|
||||
2 => Colours::Yellow,
|
||||
_ => Colours::Blue,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// implements Display for Colours
|
||||
impl fmt::Display for Colours {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match *self {
|
||||
Colours::Red => write!(f, "Red"),
|
||||
Colours::Green => write!(f, "Green"),
|
||||
Colours::Yellow => write!(f, "Yellow"),
|
||||
Colours::Blue => write!(f, "Blue"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Ballpit {
|
||||
remaining: u32,
|
||||
}
|
||||
|
||||
impl Ballpit {
|
||||
/**
|
||||
* # Summary
|
||||
* Creates a new ballpit.
|
||||
*
|
||||
* # Parameters
|
||||
* ## no_of_balls
|
||||
* The inital number of balls in the pit
|
||||
*
|
||||
* # Returns
|
||||
* A new ```Ballpit``` object
|
||||
*/
|
||||
pub fn new(no_of_balls: u32) -> Ballpit {
|
||||
Ballpit {
|
||||
remaining: no_of_balls,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* # Summary
|
||||
* Picks a ball from the pit, and returns it.
|
||||
* The call to this function will decrease the number of
|
||||
* balls in the pit, for if a ball it picked, it will be gone.
|
||||
*
|
||||
* # Returns
|
||||
* Returns an Option<Colours> value. The value contains the colour of
|
||||
* the ball, or ```None```, if the pit is empty.
|
||||
*/
|
||||
pub fn pick(&mut self) -> Option<Colours> {
|
||||
if self.remaining == 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
self.remaining -= 1;
|
||||
Some(rand::random())
|
||||
}
|
||||
}
|
||||
54
src/sort/buckets.rs
Normal file
54
src/sort/buckets.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
//! File: sort/buckets.rs
|
||||
//! Author: Jali <jali@orca-central.de>
|
||||
//! Created On: Thu 26 Dec 2019 10:59:40 PM CET
|
||||
//! Last Modified: Thu 26 Dec 2019 11:20:06 PM CET
|
||||
//! Description: Sorts the balls picked into buckets.
|
||||
|
||||
#[path = "./ballpit.rs"]
|
||||
mod ballpit;
|
||||
use ballpit::Ballpit;
|
||||
use ballpit::Colours;
|
||||
|
||||
pub struct Buckets {
|
||||
pub red: u32,
|
||||
pub green: u32,
|
||||
pub yellow: u32,
|
||||
pub blue: u32,
|
||||
}
|
||||
|
||||
impl Buckets {
|
||||
/**
|
||||
* # Summary
|
||||
* Creates a new buckets collection
|
||||
*
|
||||
* # Returns
|
||||
* A new ```Buckets``` object.
|
||||
*/
|
||||
pub fn new() -> Buckets {
|
||||
Buckets {
|
||||
red: 0,
|
||||
green: 0,
|
||||
yellow: 0,
|
||||
blue: 0,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn sort(&mut self, no_of_balls: u32) {
|
||||
let mut pit = Ballpit::new(no_of_balls);
|
||||
while let Some(ball) = pit.pick() {
|
||||
println!("A {} ball was picked!", ball);
|
||||
match ball {
|
||||
Colours::Red => self.red += 1,
|
||||
Colours::Green => self.green += 1,
|
||||
Colours::Yellow => self.yellow += 1,
|
||||
Colours::Blue => self.blue += 1,
|
||||
}
|
||||
}
|
||||
|
||||
println!("All {} balls where picked from the pit", no_of_balls);
|
||||
println!(
|
||||
"Of these where: {} red, {} green, {} yellow and {} blue",
|
||||
self.red, self.green, self.yellow, self.blue
|
||||
);
|
||||
}
|
||||
}
|
||||
12
src/sort/mod.rs
Normal file
12
src/sort/mod.rs
Normal file
@@ -0,0 +1,12 @@
|
||||
//! File: sort/mod.rs
|
||||
//! Created On: Thu 26 Dec 2019 10:31:54 PM CET
|
||||
//! Last Modfied: Thu 26 Dec 2019 10:31:54 PM CET
|
||||
//! Author: Jali <jali@orca-central.de>
|
||||
//! Description: Defines the command line arguments that were passed
|
||||
mod ballpit;
|
||||
mod buckets;
|
||||
|
||||
// export the ballpit module
|
||||
pub use self::ballpit::Ballpit;
|
||||
pub use self::ballpit::Colours;
|
||||
pub use self::buckets::Buckets;
|
||||
Reference in New Issue
Block a user