-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathday9.py
52 lines (45 loc) · 1.36 KB
/
day9.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import re
import itertools
def get_input():
with open('day9.txt') as fp:
input = fp.read().strip()
return dict(((min(city1,city2),max(city1,city2)),int(dist)) for city1,city2,dist in (re.search(r'^\s*(\w+)\s+to\s+(\w+)\s*=\s*(\d+)\s*$', line).groups() for line in input.split('\n')))
# end get_input
def part1(dists):
cities = set()
for city1,city2 in dists:
cities.add(city1)
cities.add(city2)
min_dist = None
for order in itertools.permutations(cities):
dist = 0
city1 = order[0]
for city2 in order[1:]:
dist += dists[(min(city1,city2),max(city1,city2))]
if min_dist is not None and dist >= min_dist:
break
city1 = city2
if min_dist is None or dist < min_dist:
min_dist = dist
return min_dist
# end part1
def part2(dists):
cities = set()
for city1,city2 in dists:
cities.add(city1)
cities.add(city2)
max_dist = 0
for order in itertools.permutations(cities):
dist = 0
city1 = order[0]
for city2 in order[1:]:
dist += dists[(min(city1,city2),max(city1,city2))]
city1 = city2
if dist > max_dist:
max_dist = dist
return max_dist
# end part2
if __name__ == '__main__':
dists = get_input()
print part1(dists)
print part2(dists)