In [4]:
bricks = []
with open('input.txt', 'rt') as f_input:
for line in f_input:
br = tuple(map(int, line.rstrip().split('/')))
bricks.append(br)
In [34]:
def bridges(bricks):
queue = [([br], br[not br.index(0)]) for br in bricks if 0 in br]
max_score = 0
while queue:
bridge, head = queue.pop(0)
extended = False
for br in bricks:
if (br not in bridge) and (head in br):
extended = True
new_bridge = bridge[:] + [br]
new_head = br[not br.index(head)]
queue.append((new_bridge, new_head))
if not extended:
score = sum(map(sum, bridge))
if score > max_score:
max_score = score
max_score_bridge = bridge[:]
return max_score, max_score_bridge
In [35]:
max_score, max_score_bridge = bridges(bricks)
In [36]:
print(max_score_bridge)
In [37]:
print(max_score)
In [76]:
import operator
def longest_bridge(bricks):
queue = [([br], br[not br.index(0)]) for br in bricks if 0 in br]
max_len_strength = (1, 0)
while queue:
bridge, head = queue.pop(0)
extended = False
for br in bricks:
if (br not in bridge) and (head in br):
extended = True
new_bridge = bridge[:] + [br]
new_head = br[not br.index(head)]
queue.append((new_bridge, new_head))
if not extended:
length = len(bridge)
strength = sum(map(sum, bridge))
if (length, strength) > max_len_strength:
max_len_strength = (length, strength)
max_score_bridge = bridge[:]
return max_len_strength, max_score_bridge
In [77]:
max_score, max_score_bridge = longest_bridge(bricks)
In [78]:
print(max_score)
In [79]:
print(max_score_bridge)