diff options
| author | nsfisis <nsfisis@gmail.com> | 2020-12-08 02:53:10 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2020-12-08 02:55:44 +0900 |
| commit | f9f462cd2feb811891fe4e4919534cbdb6dcba2c (patch) | |
| tree | ecb670b0242daa7e7e1df77c146f3881c3e075e8 /src | |
| download | rand-word-gen-f9f462cd2feb811891fe4e4919534cbdb6dcba2c.tar.gz rand-word-gen-f9f462cd2feb811891fe4e4919534cbdb6dcba2c.tar.zst rand-word-gen-f9f462cd2feb811891fe4e4919534cbdb6dcba2c.zip | |
first commit
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 32 | ||||
| -rw-r--r-- | src/main.rs | 41 |
2 files changed, 73 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..db8020e --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,32 @@ +use rand::distributions::{Distribution, WeightedIndex}; +use rand::RngCore; + +const NUM_OF_LETTERS: usize = 26; + +pub struct Model { + chars: [[usize; NUM_OF_LETTERS + 1]; NUM_OF_LETTERS + 1], +} + +impl Model { + pub fn new() -> Model { + let chars = include!(concat!(env!("OUT_DIR"), "/prebuilt_model.rs")); + Model { chars } + } + + pub fn generate<Rng: RngCore>(&self, rng: &mut Rng, len: usize) -> String { + let mut result = String::with_capacity(len); + let mut prefix = NUM_OF_LETTERS; + for _ in 0..len { + let chars = &self.chars[prefix]; + let c = select_one_char(rng, &chars); + result.push(c as char); + prefix = (c - b'a') as usize; + } + result + } +} + +fn select_one_char<Rng: RngCore>(rng: &mut Rng, freq: &[usize; NUM_OF_LETTERS + 1]) -> u8 { + let dist = WeightedIndex::new(freq).expect("invalid frequency"); + b'a' + (dist.sample(rng) as u8) +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..4ebe0fa --- /dev/null +++ b/src/main.rs @@ -0,0 +1,41 @@ +use anyhow::{Context, Result}; +use rand::distributions::{Distribution, Uniform}; +use rand_word_gen::Model; +use std::io::{BufWriter, Write}; + +fn main() -> Result<()> { + let words = parse_args()?; + + let model = Model::new(); + let out = std::io::stdout(); + let mut out = BufWriter::new(out.lock()); + let mut rng = rand::thread_rng(); + let dist = Uniform::from(3..=6); + for _ in 0..words { + let len = dist.sample(&mut rng); + writeln!(out, "{}", model.generate(&mut rng, len))?; + } + + Ok(()) +} + +fn parse_args() -> Result<usize> { + use clap::{crate_description, crate_version, value_t, App, Arg}; + + let matches = App::new("rand-word-gen") + .version(crate_version!()) + .version_short("v") + .about(crate_description!()) + .arg( + Arg::with_name("words") + .short("n") + .long("words") + .value_name("NUMBER_OF_WORDS") + .default_value("20") + .help("Sets number of generated words"), + ) + .get_matches(); + + let words = value_t!(matches, "words", usize).context("'--words' must be a number")?; + Ok(words) +} |
