Skip to content

Instantly share code, notes, and snippets.

@live-wire
Created December 20, 2022 13:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save live-wire/7263db8471a61da34e8a48eee069378a to your computer and use it in GitHub Desktop.
Save live-wire/7263db8471a61da34e8a48eee069378a to your computer and use it in GitHub Desktop.
Advent of code 2022 - Day 20 solution
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