Champernowne's constant (Euler Problem 40)

https://projecteuler.net/problem=40

An irrational decimal fraction is created by concatenating the positive integers:

0.123456789101112131415161718192021...

It can be seen that the 12th digit of the fractional part is 1.

If dn represents the nth digit of the fractional part, find the value of the following expression.

$d_{1} × d_{10} × d_{100} × d_{1000} × d_{10000} × d_{100000} × d_{1000000}$

I do not see why we cannot hold $8 bytes \times 10^{6} = 8 MB$ in memory.

In [1]:
def get_irrational_fraction(digits_max):
    s = []
    n = 1
    digits = 0
    while digits < digits_max:
        s.append(str(n))
        digits += len(str(n))
        n += 1
    return "".join(s)

assert(get_irrational_fraction(20)[12] == "1")

f = get_irrational_fraction(1000001)

Okay, we got the fractional. No we get the digits at the different positions and calculate the product. For that purpose we reuse our poduct function from problem 8.

In [2]:
def product(xs):
    from operator import mul
    from functools import reduce
    return reduce(mul, xs, 1)
In [3]:
s = product(map(int, [f[10**i - 1] for i in range(7)]))
print(s)
assert(s == 210)
210