22: Improve solution for Rust track exercise "Beer Song".
[?]
Aaw9nJhsNmfzFih9mKyNw9mV8CgERXJkRa1kK1Kx3LQH
Aug 24, 2021, 6:20 PM
ZZLDUSP36F66GUAMMCV6DA2PBJFUNGUJKACYI5UWJKIXNDZZ4KSACDependencies
- [2]
NQKFZ2HD21: Improve solution for Rust track exercise "Beer Song" (remove unnecessary `f64` casts/conversions). - [3]
6DOVDD6615: Add solution for Rust track exercise "Beer Song". - [4]
7NUHCTMK16: Apply `cargo fmt` and `cargo clippy` to the solution for Rust track exercise "Beer Song". Also add previous versions. - [5]
QK6XE5XF13: Add Rust track exercises "Beer Song", "Proverb", "Difference Of Squares", "Sum Of Multiples", "Grains", "Prime Factors", "Armstrong Numbers" and "Reverse String". - [6]
Z4YP3EEK19: Improve performance of solution for Rust track exercise "Beer Song" at the cost of duplication.
Change contents
- replacement in rust/beer-song/src/lib.rs at line 1
use std::convert::TryInto;use std::ops::Range; - replacement in rust/beer-song/src/lib.rs at line 15
fn digits(a: usize) -> usize {((a as f64).log10() as usize) + 1fn range_digits(base: usize, range: Range<usize>) -> usize {let (mut result, mut power, mut current_digits) = (0, 1, 0);while power <= range.start {power *= base;current_digits += 1;}result += (power - range.start) * current_digits;while power <= range.end {let last_power = power;power *= base;current_digits += 1;result += (power - last_power) * current_digits;}result -= (power - range.end) * current_digits;result - edit in rust/beer-song/src/lib.rs at line 32[3.2257]→[2.32:228](∅→∅),[2.228]→[3.12075:12091](∅→∅),[3.3819]→[3.12075:12091](∅→∅),[3.12091]→[2.229:346](∅→∅),[2.346]→[3.12219:12223](∅→∅),[3.12219]→[3.12219:12223](∅→∅),[3.12223]→[2.347:466](∅→∅),[2.466]→[3.12368:12440](∅→∅),[3.12368]→[3.12368:12440](∅→∅),[3.4167]→[3.37741:37744](∅→∅),[3.12440]→[3.37741:37744](∅→∅),[3.37741]→[3.37741:37744](∅→∅)
// Present conversions and type casts could be problematic for certain inputs.fn range_digits(start: usize, end: usize) -> usize {let (start_digits, end_digits) = (digits(start), digits(end));let (a, b) = (10_usize.pow(start_digits.try_into().unwrap()) - 1,10_usize.pow((end_digits - 1).try_into().unwrap()) as usize,);(digits(a + 1)..=digits(b - 1)).fold(0, |acc, elem| {acc + 9 * elem * 10_usize.pow((elem - 1).try_into().unwrap())}) + ((a - start + 1) * start_digits)+ ((end - b + 1) * end_digits)} - replacement in rust/beer-song/src/lib.rs at line 50
+ range_digits(3, s as usize)+ match e {0 => LENGTHS[0] + LENGTHS[1] + LENGTHS[2],1 => LENGTHS[1] + LENGTHS[2],2 => LENGTHS[2],_ => 0,}+ range_digits(10,Range {start: 3,end: (s + 1) as usize,},) + match e {0 => LENGTHS[0] + LENGTHS[1] + LENGTHS[2],1 => LENGTHS[1] + LENGTHS[2],2 => LENGTHS[2],_ => 0,}