From 764bc5d5259f15f251ec172aa0e21d4a29aa1d0f Mon Sep 17 00:00:00 2001 From: Walter Martin Date: Wed, 5 Feb 2020 13:47:06 -0500 Subject: [PATCH 1/3] started problem 11 --- p002.py | 18 ++++++++++++++++++ p003.py | 34 ++++++++++++++++++++++++++++++++++ p004.py | 18 ++++++++++++++++++ p005.py | 8 ++++++++ p006.py | 4 ++++ p007.py | 10 ++++++++++ p008.py | 35 +++++++++++++++++++++++++++++++++++ p009.py | 5 +++++ p010.py | 4 ++++ p011.py | 24 ++++++++++++++++++++++++ utils.py | 18 ++++++++++++++++++ 11 files changed, 178 insertions(+) create mode 100644 p002.py create mode 100644 p003.py create mode 100644 p004.py create mode 100644 p005.py create mode 100644 p006.py create mode 100644 p007.py create mode 100644 p008.py create mode 100644 p009.py create mode 100644 p010.py create mode 100644 p011.py create mode 100644 utils.py diff --git a/p002.py b/p002.py new file mode 100644 index 0000000..90473d9 --- /dev/null +++ b/p002.py @@ -0,0 +1,18 @@ +def gen_fib(upper_limit): + fib_1 = 1 + fib_2 = 2 + fib_list = [fib_1, fib_2] + fib_result = 0 + while True: + fib_result = fib_1 + fib_2 + if fib_result > upper_limit: + break + else: + fib_list.append(fib_result) + fib_1 = fib_2 + fib_2 = fib_result + return fib_list + + +fib_sum = sum(filter(lambda x: x % 2 == 0, gen_fib(4000000))) +print(fib_sum) diff --git a/p003.py b/p003.py new file mode 100644 index 0000000..1bef767 --- /dev/null +++ b/p003.py @@ -0,0 +1,34 @@ +import math +from utils import gen_primes + + +def get_prime_factors(number): + # root = math.floor(math.sqrt(number)) + primes_up_to_number = gen_primes(number) + prime_factors = [] + for prime in primes_up_to_number: + if number % prime == 0: + prime_factors.append(prime) + return sorted(prime_factors) + + +def get_prime_factors_2(number): + primes = [2] + factors = [] + test_val = 3 + while test_val < math.sqrt(number): + val_prime = True + for k in primes: + if test_val % k == 0: + val_prime = False + test_val += 2 + if val_prime: + primes.append(test_val) + if number % test_val == 0: + factors.append(test_val) + number //= test_val + factors.append(number) + return factors + + +print(get_prime_factors_2(600851475143)) diff --git a/p004.py b/p004.py new file mode 100644 index 0000000..e298133 --- /dev/null +++ b/p004.py @@ -0,0 +1,18 @@ +def is_num_palindrome(number): + return str(number) == str(number)[::-1] + + +highest = 0 +iterations = 0 +for i in range(999, 99, -1): + iterations += 1 + for j in range(999, i - 1, -1): + candidate = i * j + if is_num_palindrome(candidate) and candidate > highest: + highest = candidate + iterations = 0 + if iterations > 100: + break + + +print(highest) diff --git a/p005.py b/p005.py new file mode 100644 index 0000000..25855f6 --- /dev/null +++ b/p005.py @@ -0,0 +1,8 @@ +nums = [i for i in range(11, 21)] +product = 1 +for i in nums: + product *= i +product //= 16 +product //= 15 +product //= 12 +print(product) diff --git a/p006.py b/p006.py new file mode 100644 index 0000000..ca2ab8e --- /dev/null +++ b/p006.py @@ -0,0 +1,4 @@ +sum_squares = sum([(x + 1) ** 2 for x in range(100)]) +square_sums = sum([x + 1 for x in range(100)]) ** 2 + +print(square_sums - sum_squares) diff --git a/p007.py b/p007.py new file mode 100644 index 0000000..fa68763 --- /dev/null +++ b/p007.py @@ -0,0 +1,10 @@ +from utils import gen_primes + + +prime_list = [] +limit = 10000 +while len(prime_list) < 10001: + prime_list = gen_primes(limit) + limit *= 10 + +print(prime_list[10000]) diff --git a/p008.py b/p008.py new file mode 100644 index 0000000..a3b4e34 --- /dev/null +++ b/p008.py @@ -0,0 +1,35 @@ +num_string = """ +73167176531330624919225119674426574742355349194934 +96983520312774506326239578318016984801869478851843 +85861560789112949495459501737958331952853208805511 +12540698747158523863050715693290963295227443043557 +66896648950445244523161731856403098711121722383113 +62229893423380308135336276614282806444486645238749 +30358907296290491560440772390713810515859307960866 +70172427121883998797908792274921901699720888093776 +65727333001053367881220235421809751254540594752243 +52584907711670556013604839586446706324415722155397 +53697817977846174064955149290862569321978468622482 +83972241375657056057490261407972968652414535100474 +82166370484403199890008895243450658541227588666881 +16427171479924442928230863465674813919123162824586 +17866458359124566529476545682848912883142607690042 +24219022671055626321111109370544217506941658960408 +07198403850962455444362981230987879927244284909188 +84580156166097919133875499200524063689912560717606 +05886116467109405077541002256983155200055935729725 +71636269561882670428252483600823257530420752963450 +""" +num_string = num_string.replace('\n', '') + +highest = 0 +for i in range(len(num_string) - 12): + current = 1 + for j in range(i, i + 13): + if num_string[j] == '0': + break + current *= int(num_string[j]) + if current > highest: + highest = current + +print(highest) diff --git a/p009.py b/p009.py new file mode 100644 index 0000000..e5c9365 --- /dev/null +++ b/p009.py @@ -0,0 +1,5 @@ +for i in range(1, 999): + for j in range(i + 1, 1000 - i): + k = 1000 - i - j + if i ** 2 + j ** 2 == k ** 2: + print(i * j * k) diff --git a/p010.py b/p010.py new file mode 100644 index 0000000..1b1f214 --- /dev/null +++ b/p010.py @@ -0,0 +1,4 @@ +from utils import gen_primes + + +print(sum(gen_primes(2 * (10 ** 6)))) diff --git a/p011.py b/p011.py new file mode 100644 index 0000000..24c61c9 --- /dev/null +++ b/p011.py @@ -0,0 +1,24 @@ +num_string = """ +08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 +49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 +81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 +52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 +22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 +24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 +32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 +67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 +24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 +21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 +78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 +16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 +86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 +19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 +04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 +88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 +04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 +20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 +20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 +01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 +""" + +num_string = num_string.replace() diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..25ebf69 --- /dev/null +++ b/utils.py @@ -0,0 +1,18 @@ +import math + + +def gen_primes(upper_limit): + bool_list = [True for _ in range(upper_limit)] + bool_list[0] = False + root = math.floor(math.sqrt(upper_limit)) + for i in range(2, root + 1): + if bool_list[i - 1]: + square_list = [i ** 2 + x * i for x in range(upper_limit // i)] + for j in square_list: + if j - 1 < len(bool_list): + bool_list[j - 1] = False + prime_list = [] + for x in range(len(bool_list)): + if bool_list[x]: + prime_list.append(x + 1) + return prime_list From 2078c2f4b2c983f4961718889f37b23c16c2149f Mon Sep 17 00:00:00 2001 From: Walter Martin Date: Wed, 5 Feb 2020 14:59:41 -0500 Subject: [PATCH 2/3] problems 11, 14, 16 done --- p011.py | 29 ++++++++++++++++++++++++++++- p014.py | 22 ++++++++++++++++++++++ p016.py | 7 +++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 p014.py create mode 100644 p016.py diff --git a/p011.py b/p011.py index 24c61c9..a74195c 100644 --- a/p011.py +++ b/p011.py @@ -21,4 +21,31 @@ 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 """ -num_string = num_string.replace() +rows = num_string.strip().split('\n') +parsed_rows = [] +for row in rows: + parsed_rows.append([int(x) for x in row.strip().split(' ')]) + +max_product = 0 +for row in range(len(parsed_rows)): + for start in range(len(parsed_rows[0]) - 3): + product1 = 1 + product2 = 1 + product3 = 1 + product4 = 1 + for i in range(4): + product1 *= parsed_rows[row][start + i] + product2 *= parsed_rows[start + i][row] + if row + 3 < len(parsed_rows[0]): + product3 *= parsed_rows[row + i][start + i] + product4 *= parsed_rows[row + 3 - i][start + i] + if product1 > max_product: + max_product = product1 + if product2 > max_product: + max_product = product2 + if product3 > max_product: + max_product = product3 + if product4 > max_product: + max_product = product4 + +print(max_product) diff --git a/p014.py b/p014.py new file mode 100644 index 0000000..59a02f1 --- /dev/null +++ b/p014.py @@ -0,0 +1,22 @@ +big_list = [None for i in range(1000000 - 1)] +big_list[0] = 1 + +def find_collatz_length(number, big_list): + if number < 1000000 and big_list[number - 1] is not None: + return big_list[number - 1] + else: + if number % 2 == 0: + length = 1 + find_collatz_length(number // 2, big_list) + else: + length = 1 + find_collatz_length(number * 3 + 1, big_list) + if number < 1000000: + big_list[number - 1] = length + return length + +max_len = 0 +# for i in len(big_list): +for i in range(1000000 - 1): + length = find_collatz_length(i + 1, big_list) + if length > max_len: + print(i + 1) + max_len = length diff --git a/p016.py b/p016.py new file mode 100644 index 0000000..1dd9af2 --- /dev/null +++ b/p016.py @@ -0,0 +1,7 @@ +result = 2 ** 1000 +result = str(result) +sum_digits = 0 +for ch in result: + sum_digits += int(ch) + +print(sum_digits) From 792ca518c84d9c4d3760eaa157e00b63a688eb6b Mon Sep 17 00:00:00 2001 From: Walter Martin Date: Mon, 10 Feb 2020 10:22:15 -0500 Subject: [PATCH 3/3] 6 new problems --- p002.py | 16 +-------- p012.py | 21 +++++++++++ p013.py | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ p015.py | 1 + p017.py | 63 +++++++++++++++++++++++++++++++++ p020.py | 3 ++ p025.py | 5 +++ utils.py | 15 ++++++++ 8 files changed, 215 insertions(+), 15 deletions(-) create mode 100644 p012.py create mode 100644 p013.py create mode 100644 p015.py create mode 100644 p017.py create mode 100644 p020.py create mode 100644 p025.py diff --git a/p002.py b/p002.py index 90473d9..482cc99 100644 --- a/p002.py +++ b/p002.py @@ -1,18 +1,4 @@ -def gen_fib(upper_limit): - fib_1 = 1 - fib_2 = 2 - fib_list = [fib_1, fib_2] - fib_result = 0 - while True: - fib_result = fib_1 + fib_2 - if fib_result > upper_limit: - break - else: - fib_list.append(fib_result) - fib_1 = fib_2 - fib_2 = fib_result - return fib_list - +from utils import gen_fib fib_sum = sum(filter(lambda x: x % 2 == 0, gen_fib(4000000))) print(fib_sum) diff --git a/p012.py b/p012.py new file mode 100644 index 0000000..2a5c568 --- /dev/null +++ b/p012.py @@ -0,0 +1,21 @@ +import math + +def gen_divisors(number): + divisors = [] + root = math.floor(math.sqrt(number)) + for i in range(1, root + 1): + if number % i == 0: + divisors.append(i) + if i != root: + divisors.append(number // i) + return sorted(divisors) + +num_divisors = 0 +num = 0 +addition = 1 +while num_divisors < 500: + num += addition + num_divisors = len(gen_divisors(num)) + addition += 1 + +print(num) diff --git a/p013.py b/p013.py new file mode 100644 index 0000000..0b1ea0a --- /dev/null +++ b/p013.py @@ -0,0 +1,106 @@ +nums = """ +37107287533902102798797998220837590246510135740250 +46376937677490009712648124896970078050417018260538 +74324986199524741059474233309513058123726617309629 +91942213363574161572522430563301811072406154908250 +23067588207539346171171980310421047513778063246676 +89261670696623633820136378418383684178734361726757 +28112879812849979408065481931592621691275889832738 +44274228917432520321923589422876796487670272189318 +47451445736001306439091167216856844588711603153276 +70386486105843025439939619828917593665686757934951 +62176457141856560629502157223196586755079324193331 +64906352462741904929101432445813822663347944758178 +92575867718337217661963751590579239728245598838407 +58203565325359399008402633568948830189458628227828 +80181199384826282014278194139940567587151170094390 +35398664372827112653829987240784473053190104293586 +86515506006295864861532075273371959191420517255829 +71693888707715466499115593487603532921714970056938 +54370070576826684624621495650076471787294438377604 +53282654108756828443191190634694037855217779295145 +36123272525000296071075082563815656710885258350721 +45876576172410976447339110607218265236877223636045 +17423706905851860660448207621209813287860733969412 +81142660418086830619328460811191061556940512689692 +51934325451728388641918047049293215058642563049483 +62467221648435076201727918039944693004732956340691 +15732444386908125794514089057706229429197107928209 +55037687525678773091862540744969844508330393682126 +18336384825330154686196124348767681297534375946515 +80386287592878490201521685554828717201219257766954 +78182833757993103614740356856449095527097864797581 +16726320100436897842553539920931837441497806860984 +48403098129077791799088218795327364475675590848030 +87086987551392711854517078544161852424320693150332 +59959406895756536782107074926966537676326235447210 +69793950679652694742597709739166693763042633987085 +41052684708299085211399427365734116182760315001271 +65378607361501080857009149939512557028198746004375 +35829035317434717326932123578154982629742552737307 +94953759765105305946966067683156574377167401875275 +88902802571733229619176668713819931811048770190271 +25267680276078003013678680992525463401061632866526 +36270218540497705585629946580636237993140746255962 +24074486908231174977792365466257246923322810917141 +91430288197103288597806669760892938638285025333403 +34413065578016127815921815005561868836468420090470 +23053081172816430487623791969842487255036638784583 +11487696932154902810424020138335124462181441773470 +63783299490636259666498587618221225225512486764533 +67720186971698544312419572409913959008952310058822 +95548255300263520781532296796249481641953868218774 +76085327132285723110424803456124867697064507995236 +37774242535411291684276865538926205024910326572967 +23701913275725675285653248258265463092207058596522 +29798860272258331913126375147341994889534765745501 +18495701454879288984856827726077713721403798879715 +38298203783031473527721580348144513491373226651381 +34829543829199918180278916522431027392251122869539 +40957953066405232632538044100059654939159879593635 +29746152185502371307642255121183693803580388584903 +41698116222072977186158236678424689157993532961922 +62467957194401269043877107275048102390895523597457 +23189706772547915061505504953922979530901129967519 +86188088225875314529584099251203829009407770775672 +11306739708304724483816533873502340845647058077308 +82959174767140363198008187129011875491310547126581 +97623331044818386269515456334926366572897563400500 +42846280183517070527831839425882145521227251250327 +55121603546981200581762165212827652751691296897789 +32238195734329339946437501907836945765883352399886 +75506164965184775180738168837861091527357929701337 +62177842752192623401942399639168044983993173312731 +32924185707147349566916674687634660915035914677504 +99518671430235219628894890102423325116913619626622 +73267460800591547471830798392868535206946944540724 +76841822524674417161514036427982273348055556214818 +97142617910342598647204516893989422179826088076852 +87783646182799346313767754307809363333018982642090 +10848802521674670883215120185883543223812876952786 +71329612474782464538636993009049310363619763878039 +62184073572399794223406235393808339651327408011116 +66627891981488087797941876876144230030984490851411 +60661826293682836764744779239180335110989069790714 +85786944089552990653640447425576083659976645795096 +66024396409905389607120198219976047599490197230297 +64913982680032973156037120041377903785566085089252 +16730939319872750275468906903707539413042652315011 +94809377245048795150954100921645863754710598436791 +78639167021187492431995700641917969777599028300699 +15368713711936614952811305876380278410754449733078 +40789923115535562561142322423255033685442488917353 +44889911501440648020369068063960672322193204149535 +41503128880339536053299340368006977710650566631954 +81234880673210146739058568557934581403627822703280 +82616570773948327592232845941706525094512325230608 +22918802058777319719839450180888072429661980811197 +77158542502016545090413245809786882778948721859617 +72107838435069186155435662884062257473692284509516 +20849603980134001723930671666823555245252804609722 +53503534226472524250874054075591789781264330331690 +""" + +num_strings = nums.strip().split('\n') +front_sum = sum([int(x[:11]) for x in num_strings]) +print(str(front_sum)[:10]) diff --git a/p015.py b/p015.py new file mode 100644 index 0000000..cc4ac42 --- /dev/null +++ b/p015.py @@ -0,0 +1 @@ +print(39 * 37 * 7 * 33 * 31 * 29 * 5 * 2 * 23 * 2) diff --git a/p017.py b/p017.py new file mode 100644 index 0000000..6f2a7ed --- /dev/null +++ b/p017.py @@ -0,0 +1,63 @@ +letter_sum = 0 +one = len('one') +letter_sum += (9 * 10 + 100 + 1) * one +two = len('two') +letter_sum += (9 * 10 + 100) * two +three = len('three') +letter_sum += (9 * 10 + 100) * three +four = len('four') +letter_sum += (9 * 10 + 100) * four +five = len('five') +letter_sum += (9 * 10 + 100) * five +six = len('six') +letter_sum += (9 * 10 + 100) * six +seven = len('seven') +letter_sum += (9 * 10 + 100) * seven +eight = len('eight') +letter_sum += (9 * 10 + 100) * eight +nine = len('nine') +letter_sum += (9 * 10 + 100) * nine +ten = len('ten') +letter_sum += 10 * ten +eleven = len('eleven') +letter_sum += 10 * eleven +twelve = len('twelve') +letter_sum += 10 * twelve +thirteen = len('thirteen') +letter_sum += 10 * thirteen +fourteen = len('fourteen') +letter_sum += 10 * fourteen +fifteen = len('fifteen') +letter_sum += 10 * fifteen +sixteen = len('sixteen') +letter_sum += 10 * sixteen +seventeen = len('seventeen') +letter_sum += 10 * seventeen +eighteen = len('eighteen') +letter_sum += 10 * eighteen +nineteen = len('nineteen') +letter_sum += 10 * nineteen +twenty = len('twenty') +letter_sum += 100 * twenty +thirty = len('thirty') +letter_sum += 100 * thirty +forty = len('forty') +letter_sum += 100 * forty +fifty = len('fifty') +letter_sum += 100 * fifty +sixty = len('sixty') +letter_sum += 100 * sixty +seventy = len('seventy') +letter_sum += 100 * seventy +eighty = len('eighty') +letter_sum += 100 * eighty +ninety = len('ninety') +letter_sum += 100 * ninety +hundred = len('hundred') +letter_sum += 9 * 100 * hundred +and_len = len('and') +letter_sum += 9 * 99 * and_len +thousand = len('thousand') +letter_sum += 1 * thousand + +print(letter_sum) diff --git a/p020.py b/p020.py new file mode 100644 index 0000000..00849eb --- /dev/null +++ b/p020.py @@ -0,0 +1,3 @@ +import math + +print(sum([int(x) for x in str(math.factorial(99))])) diff --git a/p025.py b/p025.py new file mode 100644 index 0000000..6a7752e --- /dev/null +++ b/p025.py @@ -0,0 +1,5 @@ +from utils import gen_fib + +big_fib_list = gen_fib(10 ** 999) + +print(len(big_fib_list) + 1) diff --git a/utils.py b/utils.py index 25ebf69..0775c3a 100644 --- a/utils.py +++ b/utils.py @@ -16,3 +16,18 @@ def gen_primes(upper_limit): if bool_list[x]: prime_list.append(x + 1) return prime_list + +def gen_fib(upper_limit): + fib_1 = 1 + fib_2 = 1 + fib_list = [fib_1, fib_2] + fib_result = 0 + while True: + fib_result = fib_1 + fib_2 + if fib_result > upper_limit: + break + else: + fib_list.append(fib_result) + fib_1 = fib_2 + fib_2 = fib_result + return fib_list