Project Euler Solution 40: Champernowne's constant
Problem 40: Champernowne's constant is about a constant which digit's are made up from the natural numbers.
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 $d_n$ represents the nth digit of the fractional part, find the value of the following expression.
$d_1 \times d_{10} \times d_{100} \times d_{1000} \times d_{10000} \times d_{100000} \times d_{1000000}$
Here I found it helpful to construct a sensible generator for the digits such that the counting becomes easy.
def generate_digits() -> Iterator[str]: for number in itertools.count(1): s = str(number) yield from s
As usual, write a test to make sure that it works properly.
def test_generate_digits() -> None: s = "".join(itertools.islice(generate_digits(), 20)) assert s == "12345678910111213141"
Then the solution is rather straightforward, just go through all the digits and take out the ones we are interested in.
def solution() -> int: result = 1 power_of_ten = 1 for i, digit in enumerate(generate_digits(), start=1): if i == power_of_ten: result *= int(digit) power_of_ten *= 10 if power_of_ten > 1_000_000: break return result
This produces the result in 93 ms.