Initial commit

This commit is contained in:
Kevin Keogh
2018-07-02 15:45:49 -04:00
parent 60b3954a3b
commit fd817f8811
28 changed files with 809 additions and 0 deletions

BIN
.problem-54.py.swp Normal file

Binary file not shown.

54
primes.py Normal file
View File

@@ -0,0 +1,54 @@
def sieve(limit):
'''https://stackoverflow.com/a/3941967
'''
a = [True] * limit # Initialize the primality list
a[0] = a[1] = False
for (i, isprime) in enumerate(a):
if isprime:
yield i
for n in range(i*i, limit, i): # Mark factors non-prime
a[n] = False
def is_prime(n):
'''Returns True if n is prime.
https://stackoverflow.com/a/18833845'''
if n == 1:
return False
if n == 2:
return True
if n == 3:
return True
if n % 2 == 0:
return False
if n % 3 == 0:
return False
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w
return True
def prime_factors(n):
'''https://stackoverflow.com/a/22808285
'''
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors

24
problem-22.py Normal file
View File

@@ -0,0 +1,24 @@
import requests
import string
if __name__ == '__main__':
url = 'https://projecteuler.net/project/resources/p022_names.txt'
text = requests.get(url).text.replace('"', '')
names = sorted(text.split(','))
letter_values = dict(zip(string.ascii_uppercase, list(range(1, 27))))
total = 0
for idx, name in enumerate(names):
name_total = 0
for letter in name:
name_total += letter_values[letter]
if name == 'COLIN':
print(name, idx+1, name_total, (idx+1) * name_total)
total += (idx+1) * name_total
print(total)

14
problem-26.py Normal file
View File

@@ -0,0 +1,14 @@
tests = [(x, 1/x) for x in range(2,11)]
def check_repeats(number):
number = str(number)
longest = ''
for i in range(1, len(number)+1):
sample = number[:i]
while number[:i] ==
if __name__ == '__main__':
for test in tests:
result = check_repeats(str(test[1])[2:])
print('Test %s = %s, %s\n'.format(test[0], test[1], result))

37
problem-27.py Normal file
View File

@@ -0,0 +1,37 @@
import math
import itertools
def is_prime(n):
if n % 2 == 0 and n > 2 or n < 0:
return False
return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
def form(n, a, b):
result = n**2 + a*n + b
return n**2 + a*n + b
def get_sequence(pair):
i = 0
while True:
if not is_prime(form(i, pair[0], pair[1])):
return list(range(i))
i += 1
if __name__ == '__main__':
a = list(range(-1000, 1000))
b = list(range(-1000, 1001))
pairs = list(itertools.product(a, b))
print('number of pairs:', len(pairs))
longest = [pairs[0], [0]]
for pair in pairs:
seq = get_sequence(pair)
if len(seq) > len(longest[1]):
longest = (pair, seq)
print(longest)

12
problem-28.py Normal file
View File

@@ -0,0 +1,12 @@
nums = [1]
spiral = 1
while spiral < 1001:
spiral += 2
circ = list(range(nums[-1] + 1, nums[-1] + (spiral**2)))
nums.append(circ[(spiral-1)*1-1])
nums.append(circ[(spiral-1)*2-1])
nums.append(circ[(spiral-1)*3-1])
nums.append(circ[(spiral-1)*4-1])
print(spiral)
print(sum(nums))

9
problem-29.py Normal file
View File

@@ -0,0 +1,9 @@
results = []
if __name__ == '__main__':
for a in range(2, 101):
for b in range(2, 101):
results.append(a**b)
print(len(set(results)))

14
problem-30.py Normal file
View File

@@ -0,0 +1,14 @@
MAX_NUM = 1000000
results = []
for i in range(2, MAX_NUM+1):
digits = list(str(i))
total = sum([int(x)**5 for x in digits])
if total == i:
results.append(i)
print(results)
print(sum(results))
print(len(results))

38
problem-31.py Normal file
View File

@@ -0,0 +1,38 @@
import itertools
pence = list(range(201))
two_pence = list(range(101))
five_pence = list(range(41))
ten_pence = list(range(21))
twenty_pence = list(range(11))
fifty_pence = list(range(5))
pound = [0, 1, 2]
two_pound = [0, 1]
results = []
combos = itertools.product(
pence,
two_pence,
five_pence,
ten_pence,
twenty_pence,
fifty_pence,
pound,
# two_pound
)
for combo in combos:
if combo[0] \
+ combo[1] * 2 \
+ combo[2] * 5 \
+ combo[3] * 10 \
+ combo[4] * 20 \
+ combo[5] * 50 \
+ combo[6] * 100 == 200:
results.append(combo)
results.append((0, 0, 0, 0, 0, 0)) # representing 1 pound coin
print(results)
print(len(results))

17
problem-32.py Normal file
View File

@@ -0,0 +1,17 @@
import itertools
from pprint import pprint
MAX_NUM = int(999999999**0.5) + 1
results = []
for i in range(MAX_NUM):
for j in range(MAX_NUM):
num = i * j
if ''.join(sorted(str(i) + str(j) + str(num))) == '123456789':
results.append((i, j, num))
pprint(results)
print(len(results))
print(sum(set(x[2] for x in results)))

25
problem-33.py Normal file
View File

@@ -0,0 +1,25 @@
from pprint import pprint
results = []
for numerator in range(10, 100):
if str(numerator)[-1] == '0':
continue
for denominator in range(10, 100):
if str(denominator)[-1] == '0':
continue
if str(numerator)[0] == str(numerator)[1] \
and str(denominator)[0] == str(denominator)[1]:
continue
frac = numerator / denominator
if frac < 1:
short_numerator = int(str(numerator)[0])
short_denominator = int(str(denominator)[1])
short_frac = short_numerator / short_denominator
if numerator == 49 and denominator == 98:
pprint(locals())
if frac == short_frac:
results.append((numerator, denominator))
pprint(results)

18
problem-34.py Normal file
View File

@@ -0,0 +1,18 @@
MAX_NUM = 100000
def fact(n):
result = 1
for i in range(2, n+1):
result *= i
return result
if __name__ == '__main__':
results = []
for i in range(3, MAX_NUM):
digits = list(str(i))
if i == sum([fact(int(j)) for j in digits]):
results.append(i)
print(results)
print(sum(results))

52
problem-35.py Normal file
View File

@@ -0,0 +1,52 @@
MAX_NUM = 1000000
def is_prime(n):
"""Returns True if n is prime."""
if n == 1:
return False
if n == 2:
return True
if n == 3:
return True
if n % 2 == 0:
return False
if n % 3 == 0:
return False
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w
return True
if __name__ == '__main__':
results = []
for i in range(MAX_NUM):
if not is_prime(i):
continue
j = str(i)
if len(j) == 1:
if is_prime(i):
results.append(i)
continue
if len(j) == 2:
if is_prime(i) and is_prime(int(j[1] + j[0])):
results.append(i)
continue
for rotation in range(len(j)):
prime = True
j = j[1] + j[2:] + j[0]
if not is_prime(int(j)):
prime = False
break
if prime is True: results.append(i)
print(results)
print(len(results))

13
problem-36.py Normal file
View File

@@ -0,0 +1,13 @@
MAX_NUM = 1000000
if __name__ == '__main__':
results = []
for i in range(MAX_NUM):
rev = int(str(i)[::-1])
binary_i = bin(i)[2:]
rev_binary_i = binary_i[::-1]
if i == rev and binary_i == rev_binary_i:
results.append(i)
print(results)
print(sum(results))

55
problem-37.py Normal file
View File

@@ -0,0 +1,55 @@
NUM_PRIMES = 11
START_NUM = 9
def is_prime(n):
"""Returns True if n is prime."""
if n == 1:
return False
if n == 2:
return True
if n == 3:
return True
if n % 2 == 0:
return False
if n % 3 == 0:
return False
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w
return True
def truncatable_prime(i):
j = i
for _ in range(len(j)):
if not is_prime(int(j)):
return False
j = j[1:]
j = i
for _ in range(len(j)):
if not is_prime(int(j)):
return False
j = j[:-1]
return True
if __name__ == '__main__':
results = []
i = START_NUM
while len(results) != NUM_PRIMES:
i += 1
if truncatable_prime(str(i)):
results.append(i)
print(results)
print(sum(results))

27
problem-39.py Normal file
View File

@@ -0,0 +1,27 @@
from pprint import pprint
MAX_NUM = 1000
if __name__ == '__main__':
As = list(range(1, MAX_NUM))
results = []
totals = {}
for a in As:
for b in range(a, MAX_NUM):
if a > b:
continue
c = (a**2 + b**2) ** 0.5
if c % 1 != 0:
continue
total = a + b + int(c)
if total > MAX_NUM:
continue
results.append((a, b, int(c), total))
if total in totals:
totals[total] += 1
else:
totals[total] = 1
print(max(totals, key=totals.get))

11
problem-40.py Normal file
View File

@@ -0,0 +1,11 @@
from functools import reduce
if __name__ == '__main__':
digits = [1, 10, 100, 1000, 10000, 100000, 1000000]
number = ''
for i in range(digits[-1]):
number += str(i)
results = [int(number[x]) for x in digits]
result = reduce(lambda x, y: x * y, results, 1)
print(result)

25
problem-41.py Normal file
View File

@@ -0,0 +1,25 @@
MAX_NUM = 987654321
def sieve_of_eratosthenes(limit):
a = [True] * limit # Initialize the primality list
a[0] = a[1] = False
for (i, isprime) in enumerate(a):
if isprime:
yield i
for n in range(i*i, limit, i): # Mark factors non-prime
a[n] = False
if __name__ == '__main__':
results = []
digits = '123456789'
primes = sieve_of_eratosthenes(MAX_NUM)
for prime in primes:
if ''.join(sorted(str(prime))) == digits[:len(str(prime))]:
results.append(prime)
print(results)

27
problem-42.py Normal file
View File

@@ -0,0 +1,27 @@
import string
import requests
MAX_NUM = 10000
letter_values = dict(zip(string.ascii_uppercase, list(range(1, 27))))
triangle_numbers = [0.5*n*(n+1) for n in range(MAX_NUM+1)]
def value(word):
value = 0
for letter in word:
value += letter_values[letter]
return value
if __name__ == '__main__':
data_url = 'https://projecteuler.net/project/resources/p042_words.txt'
text = requests.get(data_url).text.replace('"', '')
words = text.split(',')
results = []
for word in words:
if value(word) in triangle_numbers:
results.append(word)
print(results)
print(len(results))

37
problem-43.py Normal file
View File

@@ -0,0 +1,37 @@
import itertools
from primes import is_prime
import string
def is_pandigital(num):
digits = string.digits[1:] + '0'
digits = digits[:len(str(num))]
if sorted(str(num)) == sorted(digits):
return True
else:
return False
if __name__ == '__main__':
results = []
numbers = [int(''.join(x)) for x in itertools.permutations(string.digits)]
primes = [x for x in numbers if is_pandigital(x)]
for prime in primes:
if int(str(prime)[1:4]) % 2 != 0:
continue
if int(str(prime)[2:5]) % 3 != 0:
continue
if int(str(prime)[3:6]) % 5 != 0:
continue
if int(str(prime)[4:7]) % 7 != 0:
continue
if int(str(prime)[5:8]) % 11 != 0:
continue
if int(str(prime)[6:9]) % 13 != 0:
continue
if int(str(prime)[7:10]) % 17 != 0:
continue
results.append(prime)
print(results)
print(sum(results))

26
problem-44.py Normal file
View File

@@ -0,0 +1,26 @@
import itertools
def pentagonal_number(n):
return n * (3 * n - 1) / 2
if __name__ == '__main__':
pentagonals = []
for i in range(1, 10000):
pentagonals.append(pentagonal_number(i))
pentagonals = set(pentagonals)
combos = itertools.combinations(pentagonals, 2)
lowest_diff = 9999999
final_pents = False
for combo in combos:
total = combo[0] + combo[1]
diff = abs(combo[0] - combo[1])
if total in pentagonals and diff in pentagonals:
if diff < lowest_diff:
lowest_diff = diff
final_pents = combo
print(final_pents)
print(lowest_diff)

24
problem-45.py Normal file
View File

@@ -0,0 +1,24 @@
import itertools
SAMPLES = 100000
def triangle_num(n):
return n * (n+1) / 2
def pentagonal_num(n):
return n * (3 * n -1) / 2
def hexagonal_num(n):
return n * (2 * n - 1)
if __name__ == '__main__':
tris = [triangle_num(x) for x in range(2, SAMPLES)]
pents = [pentagonal_num(x) for x in range(2, SAMPLES)]
hexs = [hexagonal_num(x) for x in range(2, SAMPLES)]
triplets = itertools.product(tris, pents, hexs)
print(set(tris) & set(pents) & set(hexs))

14
problem-47.py Normal file
View File

@@ -0,0 +1,14 @@
from primes import prime_factors
if __name__ == '__main__':
factors = [None, None, None, None]
for i in range(3, 1000000):
factors.append(prime_factors(i))
factors = factors[1:]
if None in factors: continue
if all(len(set(x)) > 3 for x in factors):
print(i - 3, i, [set(x) for x in factors])
break

8
problem-48.py Normal file
View File

@@ -0,0 +1,8 @@
if __name__ == '__main__':
num = 0
for i in range(1, 1001):
num += i ** i
print(str(num)[-10:])

30
problem-49.py Normal file
View File

@@ -0,0 +1,30 @@
import itertools
from pprint import pprint
from primes import is_prime
if __name__ == '__main__':
results = []
for i in range(1000, 10000):
combos = set(''.join(x) for x in itertools.permutations(str(i)))
combos = [int(x) for x in combos if int(x) > 1000]
if len(combos) < 3:
continue
primes = [int(x) for x in combos if is_prime(int(x))]
if len(primes) < 3:
continue
elif len(primes) > 3:
poss = itertools.combinations(primes, 3)
poss = set(poss)
for p in poss:
concat = sorted(p)
if concat not in results:
results.append(concat)
else:
results.append(sorted(primes))
results = [list(x) for x in set(tuple(x) for x in results)]
results = sorted(results, key=lambda x: (x[0], x[1]))
for result in results:
if result[1] - result[0] == result[2] - result[1]:
print(result, str(result[0]) + str(result[1]) + str(result[2]))

19
problem-50.py Normal file
View File

@@ -0,0 +1,19 @@
from primes import sieve, is_prime
from copy import deepcopy
if __name__ == '__main__':
primes = list(sieve(1000005))
longest = []
total = 0
chain = []
for idx, prime in enumerate(primes):
chain = [prime]
total = sum(chain)
while total < 1000000:
if is_prime(total) and len(chain) > len(longest):
longest = deepcopy(chain)
chain.append(primes[idx+len(chain)])
total = sum(chain)
print(longest, len(longest), sum(longest))

20
problem-52.py Normal file
View File

@@ -0,0 +1,20 @@
if __name__ == '__main__':
i = 1
while True:
two = str(2 * i)
three = str(3 * i)
four = str(4 * i)
five = str(5 * i)
six = str(6 * i)
if ( sorted(two) \
== sorted(three) \
== sorted(four) \
== sorted(five) \
== sorted(six)
):
break
i += 1
print(i, two, three, four, five, six)

159
problem-54.py Normal file
View File

@@ -0,0 +1,159 @@
import requests
url = 'https://projecteuler.net/project/resources/p054_poker.txt'
text = requests.get(url).text
hands = text.splitlines()
faces = {
'T': 10,
'J': 11,
'Q': 12,
'K': 13,
'A': 14
}
tests = [
'5H 5C 6S 7S KD 2C 3S 8S 8D TD',
'2C 3S 8S 8D TD 2C 5C 7D 8S QH',
'2D 9C AS AH AC 3D 6D 7D TD QD',
'4D 6S 9H QH QC 3D 6D 7H QD QS',
'2H 2D 4C 4D 4S 3C 3D 3S 9S 9D'
]
def is_straight(cards):
ranks = [x[0] for x in cards]
for idx, rank in enumerate(ranks):
try:
ranks[idx] = int(rank)
except ValueError:
ranks[idx] = faces[rank]
if max(ranks) - min(ranks) == 4 and len(set(ranks)) == 5:
return True
return False
def is_flush(cards):
suits = [x[1] for x in cards]
return all(x == suits[0] for x in suits)
def get_ranks(cards):
ranks = [x[0] for x in cards]
for idx, rank in enumerate(ranks):
try:
ranks[idx] = int(rank)
except ValueError:
ranks[idx] = faces[rank]
return ranks
def resolve_tie(hand_one, hand_two):
value = get_value(hand_one)
hand_one_ranks = get_ranks(hand_one)
hand_two_ranks = get_ranks(hand_two)
if is_straight(hand_one):
if max(hand_one_ranks) > max(hand_two_ranks):
return 0
else:
return 1
if value in [2, 3, 6, 7, 8]:
most_common_one = max(set(hand_one_ranks), key=hand_one_ranks.count)
most_common_two = max(set(hand_two_ranks), key=hand_two_ranks.count)
if most_common_one > most_common_two:
return 0
elif most_common_two > most_common_one:
return 1
else:
if value not in [6, 8]:
raise Exception('second level tie needed')
for idx, card in enumerate(sorted(hand_one_ranks)[::-1]):
if card > sorted(hand_two_ranks)[-1-idx]:
return 0
if card < sorted(hand_two_ranks)[-1-idx]:
return 1
def get_value(cards):
assert len(cards) == 5
ranks = [x[0] for x in cards]
for idx, rank in enumerate(ranks):
try:
ranks[idx] = int(rank)
except ValueError:
ranks[idx] = faces[rank]
flush = is_flush(cards)
straight = is_straight(cards)
groups = {}
for card in ranks:
try:
groups[card] += 1
except KeyError:
groups[card] = 1
print(groups)
group_most = max(groups.values())
if flush and sorted(ranks) == [10, 11, 12, 13, 14]:
# royal flush
return 0
elif flush and straight:
# straight flush
return 1
elif group_most == 4:
# four of a kind
return 2
elif len(groups) == 2 and group_most == 3:
# full house
return 3
elif flush:
# flush
return 4
elif straight:
# straight
return 5
elif group_most == 3:
# three of a kind
return 6
elif group_most == 2 and len(groups) == 3:
# two pair
return 7
elif group_most == 2 and len(groups) == 4:
# pair
return 8
else:
# high card
return 9
if __name__ == '__main__':
results = {'player_one': 0, 'player_two': 0}
for idx, hand in enumerate(hands):
print(idx)
hand = hand.split(' ')
player_one = hand[:5]
player_two = hand[5:]
player_one_value = get_value(player_one)
player_two_value = get_value(player_two)
print('player_one', player_one, player_one_value, is_flush(player_one), is_straight(player_one))
print('player_two', player_two, player_two_value, is_flush(player_two), is_straight(player_two))
if player_one_value == player_two_value:
if resolve_tie(player_one, player_two) == 0:
print('player_one_wins')
results['player_one'] += 1
elif resolve_tie(player_one, player_two) == 1:
print('player_two wins')
results['player_two'] += 1
elif player_one_value < player_two_value:
print('player_one wins')
results['player_one'] += 1
else:
print('player_two wins')
results['player_two'] += 1
print(results)