Files
euler-project/problems/010_problem/011_problem_jnotebook.ipynb
2020-08-02 21:06:44 -04:00

379 lines
15 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Problem 11:\n",
"\n",
"[Euler Project #11](https://projecteuler.net/problem=11)\n",
"\n",
"\n",
"> In the 20×20 grid below, four numbers along a diagonal line have been marked in red.\n",
"> \n",
"> 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 <br> \n",
"> 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 <br>\n",
"> 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 <br>\n",
"> 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 <br>\n",
"> 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 <br>\n",
"> 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 <br>\n",
"> 32 98 81 28 64 23 67 10 **26** 38 40 67 59 54 70 66 18 38 64 70 <br>\n",
"> 67 26 20 68 02 62 12 20 95 **63** 94 39 63 08 40 91 66 49 94 21 <br>\n",
"> 24 55 58 05 66 73 99 26 97 17 **78** 78 96 83 14 88 34 89 63 72 <br>\n",
"> 21 36 23 09 75 00 76 44 20 45 35 **14** 00 61 33 97 34 31 33 95 <br>\n",
"> 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 <br>\n",
"> 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 <br>\n",
"> 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 <br>\n",
"> 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 <br>\n",
"> 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 <br>\n",
"> 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 <br>\n",
"> 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 <br>\n",
"> 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 <br>\n",
"> 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 <br>\n",
"> 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 <br>\n",
"> \n",
"> The product of these numbers is 26 × 63 × 78 × 14 = 1788696.\n",
"> \n",
"> What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?\n",
"\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reserved Space For Imports\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pprint\n",
"import time # Typically imported for sleep function, to slow down execution in terminal.\n",
"import typing\n",
"import decorators # Typically imported to compute execution duration of functions.\n",
"import math\n",
"import numpy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reserved Space For Method Definition\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def check_horizontal(table,solution):\n",
" '''\n",
" Args:\n",
" table: list of lists representing the input table\n",
" solution: a dictionary storing the product, and three tuples of cell coordinates \n",
" '''\n",
" # Let's scan the horizontals first.\n",
" # Acceptable cells would have a root position (on the LHS) which may reside anywhere in the table,\n",
" # except for the last three columns.\n",
"\n",
" # create a list of tuples to store cell coordinates while generating the products\n",
" cells=[(0,0),(0,0),(0,0),(0,0)]\n",
"\n",
" # loop over row dimension\n",
" for row in range(len(table)):\n",
" # loop over column dimension\n",
" for column in range(len(table[row])-4):\n",
" # calculate product\n",
" product = 1\n",
" for i in range(4):\n",
" product *= table[row][column+i]\n",
" cells[i]=(row,column+i)\n",
" #print(\"product=\",product)\n",
" if product>solution['product']:\n",
" solution['product']=product\n",
" solution['cella']=cells[0]\n",
" solution['cellb']=cells[1]\n",
" solution['cellc']=cells[2]\n",
" solution['celld']=cells[3]\n",
" \n",
" return solution"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def check_vertical(table,solution):\n",
" '''\n",
" Args:\n",
" table: list of lists representing the input table\n",
" solution: a dictionary storing the product, and three tuples of cell coordinates \n",
" '''\n",
" # Let's scan the verticals next.\n",
" # Acceptable cells would have a root position (at the top of column) which may reside anywhere in the table,\n",
" # except for the last three rows.\n",
"\n",
" # create a list of tuples to store cell coordinates while generating the products\n",
" cells=[(0,0),(0,0),(0,0),(0,0)]\n",
"\n",
" # loop over row dimension\n",
" count = 0\n",
" for row in range(len(table)-4):\n",
" # loop over column dimension\n",
" for column in range(len(table[row])):\n",
" # convert data type from string to int\n",
" product = 1\n",
" for i in range(4):\n",
" product *= table[row+i][column]\n",
" cells[i]=(row,column+i)\n",
" #print(\"product=\",product)\n",
" count+=1\n",
" #print(\"count=\",count)\n",
" if product>solution['product']:\n",
" solution['product']=product\n",
" solution['cella']=cells[0]\n",
" solution['cellb']=cells[1]\n",
" solution['cellc']=cells[2]\n",
" solution['celld']=cells[3]\n",
" \n",
" return solution"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def check_upwards_diagonals(table,solution):\n",
" '''\n",
" Args:\n",
" table: list of lists representing the input table\n",
" solution: a dictionary storing the product, and three tuples of cell coordinates \n",
" '''\n",
" # Let's scan the upward (left to right) diagonals next.\n",
" # Acceptable cells would have a root position (at the bottom-left of the diagonal) which may reside anywhere in the table,\n",
" # except for the first three rows, and the last three columns.\n",
"\n",
" # create a list of tuples to store cell coordinates while generating the products\n",
" cells=[(0,0),(0,0),(0,0),(0,0)]\n",
"\n",
" # loop over row dimension\n",
" count = 0\n",
" for row in range(len(table)-3):\n",
" # loop over column dimension\n",
" #print(\"row=\",row)\n",
" for column in range(len(table[row])-3):\n",
" # convert data type from string to int\n",
" product = 1\n",
" for i in range(4):\n",
" product *= table[row+3-i][column+i]\n",
" cells[i]=(row+3-i,column+i)\n",
" #print(\"cell=[\",row+3-i,\"][\",column+i,\"]\")\n",
" #print(\"product=\",product)\n",
" count += 1\n",
" if product>solution['product']:\n",
" solution['product']=product\n",
" solution['cella']=cells[0]\n",
" solution['cellb']=cells[1]\n",
" solution['cellc']=cells[2]\n",
" solution['celld']=cells[3]\n",
" \n",
" return solution"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def check_downwards_diagonals(table,solution):\n",
" '''\n",
" Args:\n",
" table: list of lists representing the input table\n",
" solution: a dictionary storing the product, and three tuples of cell coordinates \n",
" '''\n",
" # Let's scan the downward (left to right) diagonals next.\n",
" # Acceptable cells would have a root position (at the top-left of the diagonal) which may reside anywhere in the table,\n",
" # except for the last three rows, and the last three columns.\n",
"\n",
" # create a list of tuples to store cell coordinates while generating the products\n",
" cells=[(0,0),(0,0),(0,0),(0,0)]\n",
"\n",
" # loop over row dimension\n",
" count = 0\n",
" for row in range(len(table)-3):\n",
" # loop over column dimension\n",
" #print(\"row=\",row)\n",
" for column in range(len(table[row])-3):\n",
" # convert data type from string to int\n",
" product = 1\n",
" for i in range(4):\n",
" product *= table[row+i][column+i]\n",
" cells[i]=(row+i,column+i)\n",
" #print(\"cell=[\",row+i,\"][\",column+i,\"]\")\n",
" #print(\"product=\",product)\n",
" count += 1\n",
" #print(\"count=\",count)\n",
" if product>solution['product']:\n",
" solution['product']=product\n",
" solution['cella']=cells[0]\n",
" solution['cellb']=cells[1]\n",
" solution['cellc']=cells[2]\n",
" solution['celld']=cells[3]\n",
" \n",
" return solution"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Import the data table above. Let's be lazy and use the nice multi-cursor feature of the code editor."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"\n",
"table = \\\n",
" [\\\n",
" ['08', '02', '22', '97', '38', '15', '00', '40', '00', '75', '04', '05', '07', '78', '52', '12', '50', '77', '91', '08'],\n",
" ['49', '49', '99', '40', '17', '81', '18', '57', '60', '87', '17', '40', '98', '43', '69', '48', '04', '56', '62', '00'],\n",
" ['81', '49', '31', '73', '55', '79', '14', '29', '93', '71', '40', '67', '53', '88', '30', '03', '49', '13', '36', '65'],\n",
" ['52', '70', '95', '23', '04', '60', '11', '42', '69', '24', '68', '56', '01', '32', '56', '71', '37', '02', '36', '91'],\n",
" ['22', '31', '16', '71', '51', '67', '63', '89', '41', '92', '36', '54', '22', '40', '40', '28', '66', '33', '13', '80'],\n",
" ['24', '47', '32', '60', '99', '03', '45', '02', '44', '75', '33', '53', '78', '36', '84', '20', '35', '17', '12', '50'],\n",
" ['32', '98', '81', '28', '64', '23', '67', '10', '26', '38', '40', '67', '59', '54', '70', '66', '18', '38', '64', '70'],\n",
" ['67', '26', '20', '68', '02', '62', '12', '20', '95', '63', '94', '39', '63', '08', '40', '91', '66', '49', '94', '21'],\n",
" ['24', '55', '58', '05', '66', '73', '99', '26', '97', '17', '78', '78', '96', '83', '14', '88', '34', '89', '63', '72'],\n",
" ['21', '36', '23', '09', '75', '00', '76', '44', '20', '45', '35', '14', '00', '61', '33', '97', '34', '31', '33', '95'],\n",
" ['78', '17', '53', '28', '22', '75', '31', '67', '15', '94', '03', '80', '04', '62', '16', '14', '09', '53', '56', '92'],\n",
" ['16', '39', '05', '42', '96', '35', '31', '47', '55', '58', '88', '24', '00', '17', '54', '24', '36', '29', '85', '57'],\n",
" ['86', '56', '00', '48', '35', '71', '89', '07', '05', '44', '44', '37', '44', '60', '21', '58', '51', '54', '17', '58'],\n",
" ['19', '80', '81', '68', '05', '94', '47', '69', '28', '73', '92', '13', '86', '52', '17', '77', '04', '89', '55', '40'],\n",
" ['04', '52', '08', '83', '97', '35', '99', '16', '07', '97', '57', '32', '16', '26', '26', '79', '33', '27', '98', '66'],\n",
" ['88', '36', '68', '87', '57', '62', '20', '72', '03', '46', '33', '67', '46', '55', '12', '32', '63', '93', '53', '69'],\n",
" ['04', '42', '16', '73', '38', '25', '39', '11', '24', '94', '72', '18', '08', '46', '29', '32', '40', '62', '76', '36'],\n",
" ['20', '69', '36', '41', '72', '30', '23', '88', '34', '62', '99', '69', '82', '67', '59', '85', '74', '04', '36', '16'],\n",
" ['20', '73', '35', '29', '78', '31', '90', '01', '74', '31', '49', '71', '48', '86', '81', '16', '23', '57', '05', '54'],\n",
" ['01', '70', '54', '71', '83', '51', '54', '69', '16', '92', '33', '48', '61', '43', '52', '01', '89', '19', '67', '48']\n",
" ]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Firstly, this data input creates a list-of-lists which have cells of the ```string``` data type."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# loop over row dimension\n",
"for row in range(len(table)):\n",
" # loop over column dimension\n",
" for column in range(len(table[row])):\n",
" # convert data type from string to int\n",
" table[row][column] = int(table[row][column])\n",
"\n",
"# create a dictionary that stores information about the solution\n",
"solution = {\n",
" 'product':1,\n",
" 'cella':(0,0),\n",
" 'cellb':(0,0),\n",
" 'cellc':(0,0),\n",
" 'celld':(0,0)\n",
"}\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We know brute force will work...\n",
"### Can we can scan through this list-of-lists, following the accepted pattern, and store the largest product?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "{'product': 48477312, 'cella': (8, 10), 'cellb': (8, 11), 'cellc': (8, 12), 'celld': (8, 13)}\n{'product': 51267216, 'cella': (6, 15), 'cellb': (6, 16), 'cellc': (6, 17), 'celld': (6, 18)}\n{'product': 70600674, 'cella': (15, 3), 'cellb': (14, 4), 'cellc': (13, 5), 'celld': (12, 6)}\n{'product': 70600674, 'cella': (15, 3), 'cellb': (14, 4), 'cellc': (13, 5), 'celld': (12, 6)}\n"
}
],
"source": [
"solution = check_horizontal(table,solution)\n",
"print(solution)\n",
"\n",
"solution = check_vertical(table,solution)\n",
"print(solution)\n",
"\n",
"solution = check_upwards_diagonals(table,solution)\n",
"print(solution)\n",
"\n",
"solution = check_downwards_diagonals(table,solution)\n",
"print(solution)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"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.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}