Created
December 20, 2022 13:22
-
-
Save live-wire/7263db8471a61da34e8a48eee069378a to your computer and use it in GitHub Desktop.
Advent of code 2022 - Day 20 solution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Node: | |
def __init__(self, value): | |
self.value = value | |
self.next = None | |
self.prev = None | |
def __str__(self): | |
return f'[{str(self.value)}]' | |
def __repr__(self): | |
return self.__str__() | |
class LinkedList: | |
def __init__(self): | |
self.head = Node(None) | |
self.tail = Node(None) | |
self.head.next = self.tail | |
self.tail.prev = self.head | |
self.size = 0 | |
def add(self, value): | |
item = Node(value) | |
item.prev = self.tail.prev | |
item.next = self.tail | |
self.tail.prev.next = item | |
self.tail.prev = item | |
self.size += 1 | |
return item | |
def move(self, node, steps): | |
# print("Move", node, steps) | |
if steps == 0: | |
return | |
if steps > (self.size-1): | |
steps = steps % (self.size-1) | |
if steps < 0: | |
stepsp = abs(steps) | |
if stepsp > (self.size-1): | |
stepsp = stepsp % (self.size-1) | |
steps = self.size-1-stepsp | |
node.prev.next = node.next | |
node.next.prev = node.prev | |
curr = node | |
for _ in range(steps): | |
curr = curr.next | |
if curr == self.tail: | |
curr = self.head.next | |
node.next = curr.next | |
node.prev = curr | |
curr.next = node | |
node.next.prev = node | |
def result(self): | |
curr = self.head.next | |
while curr.value != 0: | |
curr = curr.next | |
ret = 0 | |
pos = 0 | |
while pos <= 3000: | |
curr = curr.next | |
pos += 1 | |
if curr == self.tail: | |
curr = self.head.next | |
if pos == 1000 or pos == 2000 or pos == 3000: | |
ret += curr.value | |
return ret | |
def __str__(self): | |
curr = self.head | |
ret = '' | |
while curr != self.tail: | |
if curr == self.head: | |
curr = curr.next | |
continue | |
ret += f'{str(curr)} ' | |
curr = curr.next | |
return ret | |
def __repr__(self): | |
return self.__str__() | |
def main(lines): | |
lst = LinkedList() | |
moves = [] | |
for line in lines: | |
line = line.strip() | |
moves.append(lst.add(int(line))) | |
# print(lst) | |
for m in moves: | |
lst.move(m, m.value) | |
# print(lst) | |
print(lst.result()) | |
def main2(lines): | |
lst = LinkedList() | |
moves = [] | |
dk = 811589153 | |
for line in lines: | |
line = line.strip() | |
moves.append(lst.add(int(line) * dk)) | |
# print(lst) | |
for _ in range(10): | |
for m in moves: | |
lst.move(m, m.value) | |
# print(lst) | |
print(lst.result()) | |
if __name__ == '__main__': | |
with open('20.input') as f: | |
lines = f.readlines() | |
print("PART-1") | |
main(lines) | |
print("PART-2") | |
main2(lines) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment