Python Implementation of Problem 99
View source code here on GitHub!
Includes
Problem Solution
1"""
2Project Euler Problem 99
3
4Comparing two numbers written in index form like 211 and 37 is not difficult, as any calculator would confirm that
5211 = 2048 < 37 = 2187.
6
7However, confirming that 632382518061 > 519432525806 would be much more difficult, as both numbers contain over three
8million digits.
9
10Using base_exp.txt (right click and 'Save Link/Target As...'), a 22K text file containing one thousand lines with a
11base/exponent pair on each line, determine which line number has the greatest numerical value.
12
13NOTE: The first two lines in the file represent the numbers in the example given above.
14"""
15from functools import cmp_to_key
16from math import log
17from typing import List, Tuple
18
19from .lib.utils import get_data_file
20
21
22def cmp_two_exp(pair1: Tuple[int, float], pair2: Tuple[int, float]) -> int:
23 base1, exp1 = pair1
24 base2, exp2 = pair2
25 exp1 *= log(base1)
26 exp2 *= log(base2)
27 if exp1 == exp2:
28 return 0
29 elif exp1 > exp2:
30 return 1
31 return -1
32
33
34def main() -> int:
35 candidates: List[Tuple[int, int]] = []
36 for line in get_data_file('p0099_base_exp.txt', 'r').splitlines():
37 x, y = line.rstrip('\n').split(',')
38 candidates.append((int(x), int(y)))
39 return max(enumerate(candidates, 1), key=lambda x: cmp_to_key(cmp_two_exp)(x[1]))[0]