Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from collections import defaultdict
- import sys
- ELVES = 463
- TOP_MARBLE = 7178700
- # ELVES = 10
- # TOP_MARBLE = 25
- MARBLE_COUNT = TOP_MARBLE + 1
- class Node(object):
- def __init__(self, value):
- self.value = value
- self.next = self
- self.prev = self
- def __repr__(self):
- return '<%s (prev=%s, next=%s)>' % (self.value, self.prev.value, self.next.value)
- class List(object):
- _count = 0
- _current_item = None
- def add(self, value):
- node = Node(value)
- if self._current_item is None:
- self._current_item = node
- self._count += 1
- else:
- node.prev = self._current_item.prev
- node.next = self._current_item
- self._current_item.prev.next = node
- self._current_item.prev = node
- self._current_item = node
- self._count += 1
- def traverse(self, number):
- if self._count == 0:
- return
- if number > 0:
- for _ in range(number):
- self._current_item = self._current_item.next
- else:
- for _ in range(-number):
- self._current_item = self._current_item.prev
- def pop(self):
- node = self._current_item
- node.prev.next = node.next
- node.next.prev = node.prev
- self._current_item = node.next
- val = node.value
- del node
- return val
- def __repr__(self):
- current = self._current_item
- lst = []
- for _ in range(self._count):
- lst.append(current.value)
- current = current.next
- return str(lst)
- def main():
- scores = defaultdict(int)
- circle = []
- current_elf = 0
- current_index = 0
- circle = List()
- for i in range(MARBLE_COUNT):
- if i > 0 and i % 23 == 0:
- scores[current_elf] += i
- circle.traverse(-7)
- scores[current_elf] += circle.pop()
- else:
- circle.traverse(2)
- circle.add(i)
- current_elf += 1
- current_elf %= ELVES
- print max(scores.values())
- if __name__ == '__main__':
- sys.exit(main())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement