diff --git a/Cargo.lock b/Cargo.lock index 347437b..c4f166d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 44f0b0c..f3c8792 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/src/parsing.rs b/src/parsing.rs index 92c74ef..7477caf 100644 --- a/src/parsing.rs +++ b/src/parsing.rs @@ -1,5 +1,4 @@ -use std::str::FromStr; - +use num::Num; use yap::{IntoTokens, Tokens}; pub fn space(tokens: &mut impl Tokens) -> bool { tokens.token(' ') @@ -9,11 +8,15 @@ pub fn newline(tokens: &mut impl Tokens) -> bool { tokens.tokens("\r\n".into_tokens()) || tokens.token('\n') } -pub fn parse_number(tokens: &mut impl Tokens) -> Option { +pub fn parse_number(tokens: &mut impl Tokens) -> Option { + parse_number_with_radix(tokens, 10) +} + +pub fn parse_number_with_radix(tokens: &mut impl Tokens, base: u32) -> Option { 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 }