Advertisement
illuminati229

AoC 2022 Day 13

Dec 13th, 2022
912
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.87 KB | None | 0 0
  1. from time import time
  2. from json import loads
  3.  
  4.  
  5. def timer_func(func):
  6.     # This function shows the execution time of
  7.     # the function object passed
  8.     def wrap_func(*args, **kwargs):
  9.         t1 = time()
  10.         result = func(*args, **kwargs)
  11.         t2 = time()
  12.         print(f'Function {func.__name__!r} executed in {(t2 - t1):.4f}s')
  13.         return result
  14.  
  15.     return wrap_func
  16.  
  17.  
  18. def insertion_sort(A):
  19.     for k in range(1, len(A)):
  20.         cur = A[k]
  21.         j = k
  22.         while j > 0 and compare_packet(cur, A[j-1]):
  23.             A[j] = A[j-1]
  24.             j -= 1
  25.             A[j] = cur
  26.     return A
  27.  
  28.  
  29. def compare_packet(left: list, right: list):
  30.     try:
  31.         for i in range(len(left)):
  32.             left_val = left[i]
  33.             right_val = right[i]
  34.             if isinstance(left_val, int) and isinstance(right_val, int):
  35.                 if left_val < right_val:
  36.                     return True
  37.                 elif left_val > right_val:
  38.                     return False
  39.                 else:
  40.                     continue
  41.             elif isinstance(left_val, list) and isinstance(right_val, int):
  42.                 if compare_packet(left_val, [right_val]) is None:
  43.                     continue
  44.                 else:
  45.                     return compare_packet(left_val, [right_val])
  46.             elif isinstance(left_val, int) and isinstance(right_val, list):
  47.                 if compare_packet([left_val], right_val) is None:
  48.                     continue
  49.                 else:
  50.                     return compare_packet([left_val], right_val)
  51.             else:
  52.                 if compare_packet(left_val, right_val) is None:
  53.                     continue
  54.                 else:
  55.                     return compare_packet(left_val, right_val)
  56.         if len(left) < len(right):
  57.             return True
  58.         return None
  59.     except IndexError:
  60.         return False
  61.  
  62.  
  63. @timer_func
  64. def day13(filepath, sort=False):
  65.     with open(filepath) as fin:
  66.         packet_pairs = fin.read().split('\n\n')
  67.  
  68.     if not sort:
  69.         correct_packets = []
  70.         for i, pair in enumerate(packet_pairs):
  71.             left_p, right_p = pair.split('\n')
  72.             left_p = loads(left_p)
  73.             right_p = loads(right_p)
  74.             if compare_packet(left_p, right_p):
  75.                 correct_packets.append(i)
  76.  
  77.         return sum(correct_packets) + len(correct_packets)
  78.     else:
  79.         packets = [loads(packet) for pair in packet_pairs for packet in pair.split('\n')]
  80.         packets.append([[2]])
  81.         packets.append([[6]])
  82.         packets_sorted = insertion_sort(packets)
  83.         return (packets_sorted.index([[2]]) + 1) * (packets_sorted.index([[6]]) + 1)
  84.  
  85.  
  86. def main():
  87.     assert day13('test13') == 13
  88.     print(day13('input13'))
  89.  
  90.     assert day13('test13', True) == 140
  91.     print(day13('input13', True))
  92.  
  93.  
  94. if __name__ == '__main__':
  95.     main()
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement