Monday, September 9, 2013

Another multiple of 10:: Rust for Problem 40

So, I decided to use Rust for problem 40, because it seemed like a fun and reasonable curly brace language that I had yet to use: This problem turned out to be pretty easy to code up (after doing all the work on paper to figure out a reasonable function for d_n, the nth digit of the concatenation of the natural numbers), so I very well may be replacing this at some point and getting to use Rust again. But anyway, Rust was nice after I cleaned up my hard drive so that I could actually install it, and here is my Rust code for Problem 40 - 40 Problems down, only 10 away from having solved 50 problems in ~50 languages (and thus only 10 away until my account levels up to level 2 on PE).



fn exp(b: int, e: int) -> int {
    if e == 0 {
        1
    } else {
        b * exp(b, e - 1)
    }
}

fn getDigit(x: int, n: int, k: int) -> int  {
    if n == k - 1 {
        x % 10
    } else {
        getDigit(x / 10, n, k - 1)
    }
}

/**The minimum n such that d_n indexes into a k-digit number*/
fn min_n(k: int) -> int {
    let mut i = 1;
    let mut sum = 0;
    while i < k {
      sum += i * exp(10, i -1);
      i += 1;
    }
    1 + (9 * sum)
}

fn d_n(n: int) -> int {
    let mut min = 1;
    let mut k = 1;
    while min_n(k) <= n {
        min = min_n(k);
        k += 1
    }
    k -= 1;
    let numIndex  = (n - min) / k;
    let digiIndex = (n - min) % k;
    getDigit(exp(10, k - 1) + numIndex, digiIndex, k)
}
fn main() {
    let mut prod = 1;
    let mut n = 1;
    while n <= 1000000 {
        prod *= d_n(n);
        n    *= 10;
    }
    println(fmt!("%d", prod));
}

No comments:

Post a Comment