diff --git a/problems/014_problem_jnotebook.ipynb b/problems/014_problem_jnotebook.ipynb index 158d2e5..51a706a 100644 --- a/problems/014_problem_jnotebook.ipynb +++ b/problems/014_problem_jnotebook.ipynb @@ -4,113 +4,25 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Problem 13:\n", + "# Problem 14:\n", "\n", - "[Euler Project #13](https://projecteuler.net/problem=13)\n", + "[Euler Project #14](https://projecteuler.net/problem=14)\n", "\n", "\n", - "> Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.\n", "\n", - "> 37107287533902102798797998220837590246510135740250\n", - "> 46376937677490009712648124896970078050417018260538\n", - "> 74324986199524741059474233309513058123726617309629\n", - "> 91942213363574161572522430563301811072406154908250\n", - "> 23067588207539346171171980310421047513778063246676\n", - "> 89261670696623633820136378418383684178734361726757\n", - "> 28112879812849979408065481931592621691275889832738\n", - "> 44274228917432520321923589422876796487670272189318\n", - "> 47451445736001306439091167216856844588711603153276\n", - "> 70386486105843025439939619828917593665686757934951\n", - "> 62176457141856560629502157223196586755079324193331\n", - "> 64906352462741904929101432445813822663347944758178\n", - "> 92575867718337217661963751590579239728245598838407\n", - "> 58203565325359399008402633568948830189458628227828\n", - "> 80181199384826282014278194139940567587151170094390\n", - "> 35398664372827112653829987240784473053190104293586\n", - "> 86515506006295864861532075273371959191420517255829\n", - "> 71693888707715466499115593487603532921714970056938\n", - "> 54370070576826684624621495650076471787294438377604\n", - "> 53282654108756828443191190634694037855217779295145\n", - "> 36123272525000296071075082563815656710885258350721\n", - "> 45876576172410976447339110607218265236877223636045\n", - "> 17423706905851860660448207621209813287860733969412\n", - "> 81142660418086830619328460811191061556940512689692\n", - "> 51934325451728388641918047049293215058642563049483\n", - "> 62467221648435076201727918039944693004732956340691\n", - "> 15732444386908125794514089057706229429197107928209\n", - "> 55037687525678773091862540744969844508330393682126\n", - "> 18336384825330154686196124348767681297534375946515\n", - "> 80386287592878490201521685554828717201219257766954\n", - "> 78182833757993103614740356856449095527097864797581\n", - "> 16726320100436897842553539920931837441497806860984\n", - "> 48403098129077791799088218795327364475675590848030\n", - "> 87086987551392711854517078544161852424320693150332\n", - "> 59959406895756536782107074926966537676326235447210\n", - "> 69793950679652694742597709739166693763042633987085\n", - "> 41052684708299085211399427365734116182760315001271\n", - "> 65378607361501080857009149939512557028198746004375\n", - "> 35829035317434717326932123578154982629742552737307\n", - "> 94953759765105305946966067683156574377167401875275\n", - "> 88902802571733229619176668713819931811048770190271\n", - "> 25267680276078003013678680992525463401061632866526\n", - "> 36270218540497705585629946580636237993140746255962\n", - "> 24074486908231174977792365466257246923322810917141\n", - "> 91430288197103288597806669760892938638285025333403\n", - "> 34413065578016127815921815005561868836468420090470\n", - "> 23053081172816430487623791969842487255036638784583\n", - "> 11487696932154902810424020138335124462181441773470\n", - "> 63783299490636259666498587618221225225512486764533\n", - "> 67720186971698544312419572409913959008952310058822\n", - "> 95548255300263520781532296796249481641953868218774\n", - "> 76085327132285723110424803456124867697064507995236\n", - "> 37774242535411291684276865538926205024910326572967\n", - "> 23701913275725675285653248258265463092207058596522\n", - "> 29798860272258331913126375147341994889534765745501\n", - "> 18495701454879288984856827726077713721403798879715\n", - "> 38298203783031473527721580348144513491373226651381\n", - "> 34829543829199918180278916522431027392251122869539\n", - "> 40957953066405232632538044100059654939159879593635\n", - "> 29746152185502371307642255121183693803580388584903\n", - "> 41698116222072977186158236678424689157993532961922\n", - "> 62467957194401269043877107275048102390895523597457\n", - "> 23189706772547915061505504953922979530901129967519\n", - "> 86188088225875314529584099251203829009407770775672\n", - "> 11306739708304724483816533873502340845647058077308\n", - "> 82959174767140363198008187129011875491310547126581\n", - "> 97623331044818386269515456334926366572897563400500\n", - "> 42846280183517070527831839425882145521227251250327\n", - "> 55121603546981200581762165212827652751691296897789\n", - "> 32238195734329339946437501907836945765883352399886\n", - "> 75506164965184775180738168837861091527357929701337\n", - "> 62177842752192623401942399639168044983993173312731\n", - "> 32924185707147349566916674687634660915035914677504\n", - "> 99518671430235219628894890102423325116913619626622\n", - "> 73267460800591547471830798392868535206946944540724\n", - "> 76841822524674417161514036427982273348055556214818\n", - "> 97142617910342598647204516893989422179826088076852\n", - "> 87783646182799346313767754307809363333018982642090\n", - "> 10848802521674670883215120185883543223812876952786\n", - "> 71329612474782464538636993009049310363619763878039\n", - "> 62184073572399794223406235393808339651327408011116\n", - "> 66627891981488087797941876876144230030984490851411\n", - "> 60661826293682836764744779239180335110989069790714\n", - "> 85786944089552990653640447425576083659976645795096\n", - "> 66024396409905389607120198219976047599490197230297\n", - "> 64913982680032973156037120041377903785566085089252\n", - "> 16730939319872750275468906903707539413042652315011\n", - "> 94809377245048795150954100921645863754710598436791\n", - "> 78639167021187492431995700641917969777599028300699\n", - "> 15368713711936614952811305876380278410754449733078\n", - "> 40789923115535562561142322423255033685442488917353\n", - "> 44889911501440648020369068063960672322193204149535\n", - "> 41503128880339536053299340368006977710650566631954\n", - "> 81234880673210146739058568557934581403627822703280\n", - "> 82616570773948327592232845941706525094512325230608\n", - "> 22918802058777319719839450180888072429661980811197\n", - "> 77158542502016545090413245809786882778948721859617\n", - "> 72107838435069186155435662884062257473692284509516\n", - "> 20849603980134001723930671666823555245252804609722\n", - "> 53503534226472524250874054075591789781264330331690\n", + "> The following iterative sequence is defined for the set of positive integers:\n", + "> \n", + "> n → n/2 (n is even)\n", + "> n → 3n + 1 (n is odd)\n", + "> \n", + "> Using the rule above and starting with 13, we generate the following sequence:\n", + "> 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1\n", + "> \n", + "> It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.\n", + "> \n", + "> Which starting number, under one million, produces the longest chain?\n", + "> \n", + "> NOTE: Once the chain starts the terms are allowed to go above one million.\n", "\n", "\n", "---" @@ -130,13 +42,7 @@ "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" + "import os" ] }, { @@ -147,228 +53,66 @@ "---" ] }, - { - "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": 2, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "numbers = [ \\\n", - " '37107287533902102798797998220837590246510135740250',\n", - " '46376937677490009712648124896970078050417018260538',\n", - " '74324986199524741059474233309513058123726617309629',\n", - " '91942213363574161572522430563301811072406154908250',\n", - " '23067588207539346171171980310421047513778063246676',\n", - " '89261670696623633820136378418383684178734361726757',\n", - " '28112879812849979408065481931592621691275889832738',\n", - " '44274228917432520321923589422876796487670272189318',\n", - " '47451445736001306439091167216856844588711603153276',\n", - " '70386486105843025439939619828917593665686757934951',\n", - " '62176457141856560629502157223196586755079324193331',\n", - " '64906352462741904929101432445813822663347944758178',\n", - " '92575867718337217661963751590579239728245598838407',\n", - " '58203565325359399008402633568948830189458628227828',\n", - " '80181199384826282014278194139940567587151170094390',\n", - " '35398664372827112653829987240784473053190104293586',\n", - " '86515506006295864861532075273371959191420517255829',\n", - " '71693888707715466499115593487603532921714970056938',\n", - " '54370070576826684624621495650076471787294438377604',\n", - " '53282654108756828443191190634694037855217779295145',\n", - " '36123272525000296071075082563815656710885258350721',\n", - " '45876576172410976447339110607218265236877223636045',\n", - " '17423706905851860660448207621209813287860733969412',\n", - " '81142660418086830619328460811191061556940512689692',\n", - " '51934325451728388641918047049293215058642563049483',\n", - " '62467221648435076201727918039944693004732956340691',\n", - " '15732444386908125794514089057706229429197107928209',\n", - " '55037687525678773091862540744969844508330393682126',\n", - " '18336384825330154686196124348767681297534375946515',\n", - " '80386287592878490201521685554828717201219257766954',\n", - " '78182833757993103614740356856449095527097864797581',\n", - " '16726320100436897842553539920931837441497806860984',\n", - " '48403098129077791799088218795327364475675590848030',\n", - " '87086987551392711854517078544161852424320693150332',\n", - " '59959406895756536782107074926966537676326235447210',\n", - " '69793950679652694742597709739166693763042633987085',\n", - " '41052684708299085211399427365734116182760315001271',\n", - " '65378607361501080857009149939512557028198746004375',\n", - " '35829035317434717326932123578154982629742552737307',\n", - " '94953759765105305946966067683156574377167401875275',\n", - " '88902802571733229619176668713819931811048770190271',\n", - " '25267680276078003013678680992525463401061632866526',\n", - " '36270218540497705585629946580636237993140746255962',\n", - " '24074486908231174977792365466257246923322810917141',\n", - " '91430288197103288597806669760892938638285025333403',\n", - " '34413065578016127815921815005561868836468420090470',\n", - " '23053081172816430487623791969842487255036638784583',\n", - " '11487696932154902810424020138335124462181441773470',\n", - " '63783299490636259666498587618221225225512486764533',\n", - " '67720186971698544312419572409913959008952310058822',\n", - " '95548255300263520781532296796249481641953868218774',\n", - " '76085327132285723110424803456124867697064507995236',\n", - " '37774242535411291684276865538926205024910326572967',\n", - " '23701913275725675285653248258265463092207058596522',\n", - " '29798860272258331913126375147341994889534765745501',\n", - " '18495701454879288984856827726077713721403798879715',\n", - " '38298203783031473527721580348144513491373226651381',\n", - " '34829543829199918180278916522431027392251122869539',\n", - " '40957953066405232632538044100059654939159879593635',\n", - " '29746152185502371307642255121183693803580388584903',\n", - " '41698116222072977186158236678424689157993532961922',\n", - " '62467957194401269043877107275048102390895523597457',\n", - " '23189706772547915061505504953922979530901129967519',\n", - " '86188088225875314529584099251203829009407770775672',\n", - " '11306739708304724483816533873502340845647058077308',\n", - " '82959174767140363198008187129011875491310547126581',\n", - " '97623331044818386269515456334926366572897563400500',\n", - " '42846280183517070527831839425882145521227251250327',\n", - " '55121603546981200581762165212827652751691296897789',\n", - " '32238195734329339946437501907836945765883352399886',\n", - " '75506164965184775180738168837861091527357929701337',\n", - " '62177842752192623401942399639168044983993173312731',\n", - " '32924185707147349566916674687634660915035914677504',\n", - " '99518671430235219628894890102423325116913619626622',\n", - " '73267460800591547471830798392868535206946944540724',\n", - " '76841822524674417161514036427982273348055556214818',\n", - " '97142617910342598647204516893989422179826088076852',\n", - " '87783646182799346313767754307809363333018982642090',\n", - " '10848802521674670883215120185883543223812876952786',\n", - " '71329612474782464538636993009049310363619763878039',\n", - " '62184073572399794223406235393808339651327408011116',\n", - " '66627891981488087797941876876144230030984490851411',\n", - " '60661826293682836764744779239180335110989069790714',\n", - " '85786944089552990653640447425576083659976645795096',\n", - " '66024396409905389607120198219976047599490197230297',\n", - " '64913982680032973156037120041377903785566085089252',\n", - " '16730939319872750275468906903707539413042652315011',\n", - " '94809377245048795150954100921645863754710598436791',\n", - " '78639167021187492431995700641917969777599028300699',\n", - " '15368713711936614952811305876380278410754449733078',\n", - " '40789923115535562561142322423255033685442488917353',\n", - " '44889911501440648020369068063960672322193204149535',\n", - " '41503128880339536053299340368006977710650566631954',\n", - " '81234880673210146739058568557934581403627822703280',\n", - " '82616570773948327592232845941706525094512325230608',\n", - " '22918802058777319719839450180888072429661980811197',\n", - " '77158542502016545090413245809786882778948721859617',\n", - " '72107838435069186155435662884062257473692284509516',\n", - " '20849603980134001723930671666823555245252804609722',\n", - " '53503534226472524250874054075591789781264330331690'\n", - "]" + "def collatz_length(n: int):\n", + " count=0\n", + " while n != 1:\n", + " if n%2 == 0:\n", + " n=int(n/2)\n", + " count+=1\n", + " else:\n", + " n=int(3*n+1)\n", + " count+=1\n", + " return int(count+1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Data Prep\n", - "- Firstly, this data input creates a list which have cells of the ```string``` data type.\n", - "- The strings should be parsed into type ```int``` at some point.\n", - "\n", - "### Solution Approach\n", - "Can we just employ old-school arithmetic by summing the integers by columns, right to left,
\n", - "carrying over anything greater than *9* to the next column?" + "### I can't think of a way to simplify the problem, so brute force then???" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": { "tags": [] }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": "The longest sequence was 525 members long, with a starting number of 837798\n" + } + ], + "source": [ + "# initialize a dictionary for storage\n", + "solution_dict = {\n", + " 'candidate': 1,\n", + " 'length': 1\n", + "}\n", + "\n", + "for i in range(1000000):\n", + " length=collatz_length(i+1)\n", + " if length > solution_dict['length']:\n", + " solution_dict['candidate']=i\n", + " solution_dict['length']=length\n", + "\n", + "print(\"The longest sequence was \",solution_dict['length'],\" members long, with a starting number of \",solution_dict['candidate']) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [], - "source": [ - "# loop over all 50 numbers in the input to convert the string \n", - "# into a list of characters, still as tpye: string\n", - "for row in range(len(numbers)): \n", - " numbers[row] = list(numbers[row])\n", - " \n", - " # loop across the newly formed list to convert the string\n", - " # character into an integer\n", - " for digit in range(len(numbers[row])):\n", - " numbers[row][digit] = int(numbers[row][digit])\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": "100\n50\n422\n467\n506\n512\n529\n538\n521\n493\n498\n459\n515\n506\n493\n507\n477\n501\n537\n519\n515\n478\n559\n542\n463\n508\n526\n534\n447\n528\n444\n530\n472\n500\n503\n497\n503\n476\n516\n487\n488\n470\n479\n493\n490\n523\n532\n556\n507\n493\n477\n553\n[2, 7, 6, 2, 9, 8, 1, 3, 8, 9, 5, 6, 3, 7, 7, 1, 7, 9, 5, 8, 9, 2, 3, 8, 6, 4, 7, 8, 4, 0, 2, 0, 3, 7, 3, 6, 6, 7, 8, 0, 9, 3, 0, 3, 2, 6, 7, 3, 7, 3, 55]\n" - } - ], - "source": [ - "# time to employ the \"old math\" by running down the columns\n", - "# and summing... Dont forget to carry-over!\n", - "\n", - "# Let's store the sums into a list...\n", - "solution_digits=[]\n", - "column_carryover = 0\n", - "\n", - "print(len(numbers))\n", - "print(len(numbers[0]))\n", - "\n", - "for places in range(len(numbers[0])):\n", - " # initialize the column sum\n", - " places = len(numbers[0])-places-1\n", - " #print(places)\n", - " column_sum = 0\n", - " \n", - " for term in range(len(numbers)):\n", - " #print(\"row=\",term,\", column=\",places)\n", - " column_sum+=numbers[term][places]\n", - " \n", - " column_sum+=column_carryover\n", - " print(column_sum)\n", - " column_carryover=0\n", - " column_sum_element = int(list(str(column_sum))[-1])\n", - " solution_digits.append(column_sum_element)\n", - "\n", - "\n", - " column_sum *= 0.1\n", - " column_carryover = column_sum.__trunc__()\n", - "\n", - "solution_digits.append(column_carryover)\n", - "print(solution_digits)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": "The solution is 55373762303\n" - } - ], - "source": [ - "solution_digits.reverse()\n", - "string=\"\"\n", - "for i in solution_digits[:10]:\n", - " string+=str(i)\n", - "\n", - "print(\"The solution is \",string)\n", - "#string.join(str(solution_digits[:10]))\n" - ] + "source": [] }, { "cell_type": "code",