day23: a bit of cleanup

This commit is contained in:
Stefan Harmuth 2020-12-23 07:56:09 +01:00
parent 3dca21452a
commit 5f0fb357bd

View File

@ -16,39 +16,32 @@ def buildDoubleLinkedListDict(cup_list):
cups = {} cups = {}
left_cup = None left_cup = None
first_cup = None first_cup = None
last_cup = None
for cup in cup_list: for cup in cup_list:
thisCup = Cup(cup, left_cup, None) thisCup = Cup(cup, left_cup, None)
if first_cup is None: if first_cup is None:
first_cup = thisCup first_cup = thisCup
else: else:
last_cup.right = thisCup left_cup.right = thisCup
left_cup = thisCup left_cup = thisCup
last_cup = thisCup
cups[cup] = thisCup cups[cup] = thisCup
first_cup.left = last_cup first_cup.left = thisCup
last_cup.right = first_cup thisCup.right = first_cup
return cups, first_cup return cups, first_cup
def play(cups, current_cup): def play(cups, current_cup, max_label):
first_pickup = current_cup.right first_pickup = current_cup.right
first_after_pickup = current_cup.right.right.right.right first_after_pickup = current_cup.right.right.right.right
current_cup.right = first_after_pickup current_cup.right = first_after_pickup
first_after_pickup.left = current_cup first_after_pickup.left = current_cup
pickup_cups = [first_pickup.label, first_pickup.right.label, first_pickup.right.right.label] destination_label = current_cup.label - 1 if current_cup.label > 1 else max_label
while destination_label in [first_pickup.label, first_pickup.right.label, first_pickup.right.right.label]:
current_label = current_cup.label - 1 if current_cup.label > 1 else max(cups.keys()) destination_label = destination_label - 1 if destination_label > 1 else max_label
while current_label in pickup_cups:
current_label -= 1
if current_label == 0:
current_label = max(cups.keys())
desination_cup = cups[current_label]
desination_cup = cups[destination_label]
desination_right = desination_cup.right desination_right = desination_cup.right
desination_cup.right = first_pickup desination_cup.right = first_pickup
first_pickup.left = desination_cup first_pickup.left = desination_cup
@ -62,8 +55,8 @@ def part1(test_mode=False):
my_input = aoclib.getInputAs2DArray(day=DAY, return_type=int, test=test_mode) my_input = aoclib.getInputAs2DArray(day=DAY, return_type=int, test=test_mode)
cups, current_cup = buildDoubleLinkedListDict(my_input[0]) cups, current_cup = buildDoubleLinkedListDict(my_input[0])
for round in range(100): for _ in range(100):
cups, current_cup = play(cups, current_cup) cups, current_cup = play(cups, current_cup, 9)
answer = "" answer = ""
add_cup = cups[1] add_cup = cups[1]
@ -78,7 +71,7 @@ def part2(test_mode=False):
my_input = aoclib.getInputAs2DArray(day=DAY, return_type=int, test=test_mode) my_input = aoclib.getInputAs2DArray(day=DAY, return_type=int, test=test_mode)
cups, current_cup = buildDoubleLinkedListDict(my_input[0] + list(range(max(my_input[0]) + 1, 1000001))) cups, current_cup = buildDoubleLinkedListDict(my_input[0] + list(range(max(my_input[0]) + 1, 1000001)))
for round in range(10000000): for _ in range(10000000):
cups, current_cup = play(cups, current_cup) cups, current_cup = play(cups, current_cup, 1000000)
return cups[1].right.label * cups[1].right.right.label return cups[1].right.label * cups[1].right.right.label