From 696dbfc7390031cf0b4ed8e6044742a61f10628b Mon Sep 17 00:00:00 2001 From: Alfred Melch Date: Wed, 23 Dec 2020 17:27:16 +0100 Subject: [PATCH] Solve 2020/23 --- 2020/23/solution1.py | 52 ++++++++++++++++++++++ 2020/23/solution2.py | 102 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 2020/23/solution1.py create mode 100644 2020/23/solution2.py diff --git a/2020/23/solution1.py b/2020/23/solution1.py new file mode 100644 index 0000000..d710b8e --- /dev/null +++ b/2020/23/solution1.py @@ -0,0 +1,52 @@ +"""Solution to 2020/23""" + +from collections import deque + +EXAMPLE = '389125467' +INPUT = '952316487' + +# INPUT = EXAMPLE + +MOVES = 100 + + +def main(): + all_cups = deque(sorted(INPUT)) + cups = deque(INPUT) + + for move in range(MOVES): + print(f'-- MOVE {move + 1} --') + while all_cups[0] != cups[0]: + all_cups.rotate() + print(f'cups: {list(cups)}') + cur = cups[0] + + cups.rotate(-1) + lift = [cups.popleft(), cups.popleft(), cups.popleft()] + next_cup = cups[0] + print('pick up:', lift) + + all_cups.rotate() + while all_cups[0] in lift: + all_cups.rotate() + destination = all_cups[0] + print('destination:', destination) + + while cups[-1] != destination: + cups.rotate() + cups.extend(lift) + + while cups[0] != next_cup: + cups.rotate() + + print('-- Final:--') + print(cups) + print() + + while cups[0] != '1': + cups.rotate() + cups.popleft() + print(''.join(list(cups))) + + +main() diff --git a/2020/23/solution2.py b/2020/23/solution2.py new file mode 100644 index 0000000..ad1da44 --- /dev/null +++ b/2020/23/solution2.py @@ -0,0 +1,102 @@ +"""Solution to 2020/23""" + +from collections import deque + +EXAMPLE = '389125467' +INPUT = '952316487' + +# INPUT = EXAMPLE + +MOVES = 10_000_000 + +INPUT = list(map(int, INPUT)) +INPUT = INPUT + list(range(max(INPUT) + 1, 1_000_000 + 1)) + + +def main(): + cups = CrabCups(INPUT) + print(cups) + + for move in range(MOVES): + if move % 1_000_000 == 0: + print(f'-- MOVE {move} --') + cups.move() + + print() + print('finished') + print(cups._nodes[1].next.value * cups._nodes[1].next.next.value) + + exit() + + +class CrabCups: + def __init__(self, cups): + nodes = dict() + i = 0 + prev = None + while i < len(cups): + node = Node(cups[i]) + if prev: + node.prev = prev + prev.next = node + prev = node + nodes[cups[i]] = node + i += 1 + nodes[cups[0]].prev = nodes[cups[-1]] + nodes[cups[-1]].next = nodes[cups[0]] + self._nodes = nodes + self.cur = nodes[cups[0]] + self.cup_count = len(cups) + self.last_cur = None + self.last_pick_up = None + self.last_destination = None + + def move(self): + pick_up = set() + link = self.cur + self.last_cur = self.cur + self.last_pick_up = link.next + for _ in range(3): + link = link.next + pick_up.add(link.value) + + # wire cur with cup after pickups + link.next.prev = self.cur + self.cur.next = link.next + + # find dest + dest = self.cur.value - 1 + dest = dest if dest != 0 else self.cup_count + while dest in pick_up: + dest -= 1 + dest = dest if dest != 0 else self.cup_count + dest = self._nodes[dest] + self.last_dest = dest + + dest.next.prev = link + link.next = dest.next + + link = link.prev.prev + dest.next = link + link.prev = dest + + self.cur = self.cur.next + + def as_list(self, start): + cups = [start.value] + cur = start.next + while not cur is start: + cups.append(cur.value) + cur = cur.next + return cups + + +class Node: + next = None + prev = None + + def __init__(self, val): + self.value = val + + +main()