Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.18 KB | None | 0 0
  1. from collections import defaultdict
  2. import sys
  3.  
  4. ELVES = 463
  5. TOP_MARBLE = 7178700
  6. # ELVES = 10
  7. # TOP_MARBLE = 25
  8. MARBLE_COUNT = TOP_MARBLE + 1
  9.  
  10.  
  11. class Node(object):
  12.     def __init__(self, value):
  13.         self.value = value
  14.         self.next = self
  15.         self.prev = self
  16.  
  17.     def __repr__(self):
  18.         return '<%s (prev=%s, next=%s)>' % (self.value, self.prev.value, self.next.value)
  19.  
  20.  
  21. class List(object):
  22.     _count = 0
  23.     _current_item = None
  24.  
  25.     def add(self, value):
  26.         node = Node(value)
  27.  
  28.         if self._current_item is None:
  29.             self._current_item = node
  30.             self._count += 1
  31.         else:
  32.             node.prev = self._current_item.prev
  33.             node.next = self._current_item
  34.             self._current_item.prev.next = node
  35.             self._current_item.prev = node
  36.             self._current_item = node
  37.             self._count += 1
  38.  
  39.     def traverse(self, number):
  40.         if self._count == 0:
  41.             return
  42.         if number > 0:
  43.             for _ in range(number):
  44.                 self._current_item = self._current_item.next
  45.         else:
  46.             for _ in range(-number):
  47.                 self._current_item = self._current_item.prev
  48.  
  49.     def pop(self):
  50.         node = self._current_item
  51.         node.prev.next = node.next
  52.         node.next.prev = node.prev
  53.         self._current_item = node.next
  54.         val = node.value
  55.         del node
  56.         return val
  57.  
  58.     def __repr__(self):
  59.         current = self._current_item
  60.         lst = []
  61.         for _ in range(self._count):
  62.             lst.append(current.value)
  63.             current = current.next
  64.         return str(lst)
  65.  
  66.  
  67. def main():
  68.     scores = defaultdict(int)
  69.     circle = []
  70.     current_elf = 0
  71.     current_index = 0
  72.  
  73.     circle = List()
  74.     for i in range(MARBLE_COUNT):
  75.         if i > 0 and i % 23 == 0:
  76.             scores[current_elf] += i
  77.             circle.traverse(-7)
  78.             scores[current_elf] += circle.pop()
  79.         else:
  80.             circle.traverse(2)
  81.             circle.add(i)
  82.  
  83.         current_elf += 1
  84.         current_elf %= ELVES
  85.  
  86.     print max(scores.values())
  87.  
  88.  
  89. if __name__ == '__main__':
  90.     sys.exit(main())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement