MojoでProject Euler 40

https://projecteuler.net/problem=40

nが何桁のところにあるか分かればかんたんですね。

import sys

#################### library ####################

fn digits(owned n: Int) -> List[Int]:
    var ds = List[Int]()
    while n > 0:
        var d = n % 10
        n //= 10
        ds.append(d)
    return ds


#################### process ####################

fn d(n: Int) -> Int:
    var s = 0
    for e in range(1, 19):
        var s1 = s + 9 * 10**(e-1) * e
        if n <= s1:
            var k = (n - s - 1) // e + 10**(e-1)
            var r = (n - s - 1) % e
            var ds = digits(k)
            return ds[e-r-1]
        s = s1
    return 0

fn f(N: Int) -> Int:
    var s = 1
    for e in range(N):
        s *= d(10**e)
    return s

fn main() raises:
    var args = sys.argv()
    var N = atol(args[1])
    print(f(N))