2019-07-19 04:52:08 +02:00
|
|
|
from lib_misc import permutations
|
|
|
|
|
|
|
|
|
|
|
|
def all_equal(xs):
|
|
|
|
x_1 = xs[0]
|
|
|
|
for x in xs[1:]:
|
|
|
|
if x_1 != x:
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def is_3_gon_ring(r):
|
|
|
|
if not (r[2] > r[0] and r[1] > r[0]):
|
|
|
|
return False
|
|
|
|
line_034 = r[0] + r[3] + r[4]
|
|
|
|
line_154 = r[1] + r[5] + r[4]
|
|
|
|
line_253 = r[2] + r[5] + r[3]
|
|
|
|
return all_equal([line_034, line_154, line_253])
|
|
|
|
|
|
|
|
|
|
|
|
def is_5_gon_ring(r):
|
|
|
|
if not (r[1] > r[0] and r[2] > r[0] and
|
|
|
|
r[3] > r[0] and r[4] > r[0]):
|
|
|
|
return False
|
|
|
|
l_056 = r[0] + r[5] + r[6]
|
|
|
|
l_167 = r[1] + r[6] + r[7]
|
|
|
|
l_278 = r[2] + r[7] + r[8]
|
|
|
|
l_389 = r[3] + r[8] + r[9]
|
|
|
|
l_495 = r[4] + r[9] + r[5]
|
|
|
|
return all_equal([l_056, l_167, l_278, l_389, l_495])
|
|
|
|
|
|
|
|
|
|
|
|
def five_gon_ring_to_group_presentation(r):
|
|
|
|
xs = [r[0], r[5], r[6],
|
|
|
|
r[1], r[6], r[7],
|
|
|
|
r[2], r[7], r[8],
|
|
|
|
r[3], r[8], r[9],
|
|
|
|
r[4], r[9], r[5]]
|
|
|
|
xs = "".join(map(str, xs))
|
|
|
|
return xs
|
|
|
|
|
|
|
|
|
2019-07-18 03:29:59 +02:00
|
|
|
def euler_068():
|
2019-07-19 04:52:08 +02:00
|
|
|
"""
|
|
|
|
This one was really fun. The hardest part was to get the
|
|
|
|
check for the representation right. This is how my five
|
|
|
|
gon ring is indexed:
|
|
|
|
|
|
|
|
# 0 1 #
|
|
|
|
# 5 #
|
|
|
|
# 9 6 #
|
|
|
|
# 4 #
|
|
|
|
# 8 7 2 #
|
|
|
|
# #
|
|
|
|
# 3 #
|
|
|
|
|
|
|
|
There is probably and automatic indexing scheme that would
|
|
|
|
make the check and presentation function easier to write, but not
|
|
|
|
necessarily easier to read. Also generating all permutations creates
|
|
|
|
a lot of over head. For example, the lowest number cannot be higher
|
|
|
|
than six so that removes about 40% of the permutations right away and
|
|
|
|
there are probably more heuristics.
|
|
|
|
"""
|
|
|
|
rs = []
|
|
|
|
for p in permutations(list(range(1, 11))):
|
|
|
|
if is_5_gon_ring(p):
|
|
|
|
r = five_gon_ring_to_group_presentation(p)
|
|
|
|
if len(r) == 16:
|
2019-07-21 20:13:28 +02:00
|
|
|
# print(r)
|
2019-07-19 04:52:08 +02:00
|
|
|
rs.append(int(r))
|
|
|
|
return max(rs)
|
2019-07-18 03:29:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
print("e068.py: " + str(euler_068()))
|
2019-07-19 04:52:08 +02:00
|
|
|
assert(euler_068() == 6531031914842725)
|