22: Improve solution for Rust track exercise "Beer Song".

[?]
Aaw9nJhsNmfzFih9mKyNw9mV8CgERXJkRa1kK1Kx3LQH
Aug 24, 2021, 6:20 PM
ZZLDUSP36F66GUAMMCV6DA2PBJFUNGUJKACYI5UWJKIXNDZZ4KSAC

Dependencies

  • [2] NQKFZ2HD 21: Improve solution for Rust track exercise "Beer Song" (remove unnecessary `f64` casts/conversions).
  • [3] 6DOVDD66 15: Add solution for Rust track exercise "Beer Song".
  • [4] 7NUHCTMK 16: Apply `cargo fmt` and `cargo clippy` to the solution for Rust track exercise "Beer Song". Also add previous versions.
  • [5] QK6XE5XF 13: Add Rust track exercises "Beer Song", "Proverb", "Difference Of Squares", "Sum Of Multiples", "Grains", "Prime Factors", "Armstrong Numbers" and "Reverse String".
  • [6] Z4YP3EEK 19: 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
    [3.37668][3.1537:1564]()
    use std::convert::TryInto;
    [3.37668]
    [3.1564]
    use std::ops::Range;
  • replacement in rust/beer-song/src/lib.rs at line 15
    [3.2117][2.0:31](),[2.31][3.2156:2191](),[3.2156][3.2156:2191]()
    fn digits(a: usize) -> usize {
    ((a as f64).log10() as usize) + 1
    [3.2117]
    [3.2191]
    fn 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
    [3.12494][2.467:504](),[2.504][3.12539:12697](),[3.12539][3.12539:12697]()
    + range_digits(3, s as usize)
    + match e {
    0 => LENGTHS[0] + LENGTHS[1] + LENGTHS[2],
    1 => LENGTHS[1] + LENGTHS[2],
    2 => LENGTHS[2],
    _ => 0,
    }
    [3.12494]
    [3.12697]
    + 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,
    }