add: simple TUI; more forgiving syntax
This commit is contained in:
Generated
+124
@@ -2,6 +2,12 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytemuck"
|
||||||
|
version = "1.20.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
@@ -14,6 +20,32 @@ version = "1.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colored"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "drawille"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e64e461c3f1e69d99372620640b3fd5f0309eeda2e26e4af69f6760c0e1df845"
|
||||||
|
dependencies = [
|
||||||
|
"colored",
|
||||||
|
"fnv",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fnv"
|
||||||
|
version = "1.0.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.15"
|
version = "0.2.15"
|
||||||
@@ -25,6 +57,12 @@ dependencies = [
|
|||||||
"wasi",
|
"wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.164"
|
version = "0.2.164"
|
||||||
@@ -110,12 +148,22 @@ dependencies = [
|
|||||||
"getrandom",
|
"getrandom",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rgb"
|
||||||
|
version = "0.8.50"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
|
||||||
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rust-roller"
|
name = "rust-roller"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nom",
|
"nom",
|
||||||
"rand",
|
"rand",
|
||||||
|
"textplots",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -129,6 +177,16 @@ dependencies = [
|
|||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "textplots"
|
||||||
|
version = "0.8.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f59b64803118dbff62f92842b3154a2c802dfd8e18660132bbcbfb141c637ae3"
|
||||||
|
dependencies = [
|
||||||
|
"drawille",
|
||||||
|
"rgb",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.14"
|
version = "1.0.14"
|
||||||
@@ -141,6 +199,72 @@ version = "0.11.0+wasi-snapshot-preview1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.48.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-targets"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
|
||||||
|
dependencies = [
|
||||||
|
"windows_aarch64_gnullvm",
|
||||||
|
"windows_aarch64_msvc",
|
||||||
|
"windows_i686_gnu",
|
||||||
|
"windows_i686_msvc",
|
||||||
|
"windows_x86_64_gnu",
|
||||||
|
"windows_x86_64_gnullvm",
|
||||||
|
"windows_x86_64_msvc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_gnullvm"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnullvm"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.48.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy"
|
name = "zerocopy"
|
||||||
version = "0.7.35"
|
version = "0.7.35"
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
nom = "7.1.3"
|
nom = "7.1.3"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
textplots = "0.8.6"
|
||||||
|
|||||||
+19
-3
@@ -1,4 +1,4 @@
|
|||||||
use nom::{branch::alt, character::complete, IResult};
|
use nom::{branch::alt, character::complete::{self, multispace0}, combinator::opt, IResult};
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -48,6 +48,10 @@ impl<const S: usize> Buckets<S> {
|
|||||||
pub fn labels(&self) -> &[i64] {
|
pub fn labels(&self) -> &[i64] {
|
||||||
&self._offsets[..]
|
&self._offsets[..]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn max(&self) -> u64 {
|
||||||
|
*self._buckets.iter().max().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Roller<const S: usize> {
|
pub struct Roller<const S: usize> {
|
||||||
@@ -71,6 +75,10 @@ impl<const S: usize> Roller<S> {
|
|||||||
return Err(nom::Err::Incomplete(nom::Needed::new(S + 1)));
|
return Err(nom::Err::Incomplete(nom::Needed::new(S + 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ignore trailing whitespace
|
||||||
|
let (e, _) = multispace0(expr)?;
|
||||||
|
expr = e;
|
||||||
|
|
||||||
// Get the next oper
|
// Get the next oper
|
||||||
if e.len() > 0 {
|
if e.len() > 0 {
|
||||||
let (e, _op) = oper(expr)?;
|
let (e, _op) = oper(expr)?;
|
||||||
@@ -192,11 +200,17 @@ impl Roll {
|
|||||||
|
|
||||||
|
|
||||||
fn term(e: &str) -> IResult<&str, Term> {
|
fn term(e: &str) -> IResult<&str, Term> {
|
||||||
|
// Ignore whitespace
|
||||||
|
let (e, _) = multispace0(e)?;
|
||||||
alt((roll, cnst))(e)
|
alt((roll, cnst))(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn roll(e: &str) -> IResult<&str, Term> {
|
fn roll(mut e: &str) -> IResult<&str, Term> {
|
||||||
let (e, reps) = complete::u64(e)?;
|
let mut reps = 1;
|
||||||
|
if let (_e, Some(_reps)) = opt(complete::u64)(e)? {
|
||||||
|
e = _e;
|
||||||
|
reps = _reps;
|
||||||
|
}
|
||||||
let (e, _) = complete::char('d')(e)?;
|
let (e, _) = complete::char('d')(e)?;
|
||||||
let (e, dice) = complete::u64(e)?;
|
let (e, dice) = complete::u64(e)?;
|
||||||
Ok((e, Term::Roll(Roll{reps, dice})))
|
Ok((e, Term::Roll(Roll{reps, dice})))
|
||||||
@@ -208,6 +222,8 @@ fn cnst(e: &str) -> IResult<&str, Term> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn oper(e: &str) -> IResult<&str, Oper> {
|
fn oper(e: &str) -> IResult<&str, Oper> {
|
||||||
|
// Ignore whitespace
|
||||||
|
let (e, _) = multispace0(e)?;
|
||||||
alt((add, sub))(e)
|
alt((add, sub))(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+43
-1
@@ -1,3 +1,45 @@
|
|||||||
|
use rand::thread_rng;
|
||||||
|
use std::io::{self, BufRead, Write};
|
||||||
|
use rust_roller::{Buckets, Roller};
|
||||||
|
use textplots::{Chart, Plot, Shape};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
let stdin = io::stdin();
|
||||||
|
print!("> ");
|
||||||
|
io::stdout().flush().unwrap();
|
||||||
|
for line in stdin.lock().lines() {
|
||||||
|
let line = line.unwrap();
|
||||||
|
let roller = match Roller::<1024>::parse(&line) {
|
||||||
|
Ok(r) => r,
|
||||||
|
Err(e) => {
|
||||||
|
println!("bad input; err: {}", e);
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
let mut bins = Buckets::<180>::new(&roller);
|
||||||
|
|
||||||
|
for _ in 0..5000 {
|
||||||
|
bins.insert(roller.roll(&mut thread_rng()));
|
||||||
|
}
|
||||||
|
|
||||||
|
let points: Vec<(f32, f32)> = bins
|
||||||
|
.labels()
|
||||||
|
.iter()
|
||||||
|
.zip(bins.buckets())
|
||||||
|
.map(|(a, b)| (*a as f32, *b as f32))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Chart::new_with_y_range(
|
||||||
|
180,
|
||||||
|
100 as u32,
|
||||||
|
roller.min() as f32,
|
||||||
|
roller.max() as f32,
|
||||||
|
0.0,
|
||||||
|
bins.max() as f32,
|
||||||
|
)
|
||||||
|
.lineplot(&Shape::Bars(&points))
|
||||||
|
.display();
|
||||||
|
print!("> ");
|
||||||
|
io::stdout().flush().unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user