provide number parsing with different radix

This commit is contained in:
Jan Christian Grünhage 2021-12-05 00:07:12 +01:00
parent 0d3b3db401
commit 0948888663
3 changed files with 92 additions and 5 deletions

83
Cargo.lock generated
View file

@ -9,6 +9,7 @@ dependencies = [
"aoc-runner",
"aoc-runner-derive",
"itertools",
"num",
"yap",
]
@ -41,6 +42,12 @@ dependencies = [
"serde_json",
]
[[package]]
name = "autocfg"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "either"
version = "1.6.1"
@ -62,6 +69,82 @@ version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
[[package]]
name = "num"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
dependencies = [
"num-bigint",
"num-complex",
"num-integer",
"num-iter",
"num-rational",
"num-traits",
]
[[package]]
name = "num-bigint"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-complex"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085"
dependencies = [
"num-traits",
]
[[package]]
name = "num-integer"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
dependencies = [
"autocfg",
"num-traits",
]
[[package]]
name = "num-iter"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a"
dependencies = [
"autocfg",
"num-bigint",
"num-integer",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
dependencies = [
"autocfg",
]
[[package]]
name = "proc-macro2"
version = "1.0.32"

View file

@ -9,4 +9,5 @@ edition = "2021"
aoc-runner = "0.3.0"
aoc-runner-derive = "0.3.0"
itertools = "0.10.1"
num = "0.4.0"
yap = "0.7.1"

View file

@ -1,5 +1,4 @@
use std::str::FromStr;
use num::Num;
use yap::{IntoTokens, Tokens};
pub fn space(tokens: &mut impl Tokens<Item = char>) -> bool {
tokens.token(' ')
@ -9,11 +8,15 @@ pub fn newline(tokens: &mut impl Tokens<Item = char>) -> bool {
tokens.tokens("\r\n".into_tokens()) || tokens.token('\n')
}
pub fn parse_number<T: FromStr>(tokens: &mut impl Tokens<Item = char>) -> Option<T> {
pub fn parse_number<T: Num>(tokens: &mut impl Tokens<Item = char>) -> Option<T> {
parse_number_with_radix(tokens, 10)
}
pub fn parse_number_with_radix<T: Num>(tokens: &mut impl Tokens<Item = char>, base: u32) -> Option<T> {
tokens.skip_tokens_while(|t| *t == ' ');
let digits: String = tokens.tokens_while(|c| c.is_digit(10)).collect();
let digits: String = tokens.tokens_while(|c| c.is_digit(base)).collect();
if digits.len() > 0 {
digits.parse().ok()
T::from_str_radix(&digits, base).ok()
} else {
None
}