119 lines
2.7 KiB
Plaintext
119 lines
2.7 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Champernowne's constant (Euler Problem 40)\n",
|
||
"\n",
|
||
"<https://projecteuler.net/problem=40>\n",
|
||
"\n",
|
||
"An irrational decimal fraction is created by concatenating the positive integers:\n",
|
||
"\n",
|
||
" 0.123456789101112131415161718192021...\n",
|
||
"\n",
|
||
"It can be seen that the 12th digit of the fractional part is 1.\n",
|
||
"\n",
|
||
"If dn represents the nth digit of the fractional part, find the value of the following expression.\n",
|
||
"\n",
|
||
"$d_{1} × d_{10} × d_{100} × d_{1000} × d_{10000} × d_{100000} × d_{1000000}$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"I do not see why we cannot hold $8 bytes \\times 10^{6} = 8 MB$ in memory."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def get_irrational_fraction(digits_max):\n",
|
||
" s = []\n",
|
||
" n = 1\n",
|
||
" digits = 0\n",
|
||
" while digits < digits_max:\n",
|
||
" s.append(str(n))\n",
|
||
" digits += len(str(n))\n",
|
||
" n += 1\n",
|
||
" return \"\".join(s)\n",
|
||
"\n",
|
||
"assert(get_irrational_fraction(20)[12] == \"1\")\n",
|
||
"\n",
|
||
"f = get_irrational_fraction(1000001)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"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."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def product(xs):\n",
|
||
" from operator import mul\n",
|
||
" from functools import reduce\n",
|
||
" return reduce(mul, xs, 1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"210\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"s = product(map(int, [f[10**i - 1] for i in range(7)]))\n",
|
||
"print(s)\n",
|
||
"assert(s == 210)"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"completion_date": "Sun, 20 May 2018, 00:40",
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python3.5",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.5.5"
|
||
},
|
||
"tags": [
|
||
"champernowne",
|
||
"product",
|
||
"fraction"
|
||
]
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|