Advertisement
Guest User

Untitled

a guest
Dec 13th, 2022
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.28 KB | None | 0 0
  1. import functools
  2.  
  3. with open("./inputs/day13.txt", "r") as f:
  4.     lines = f.read().splitlines()
  5.     packets = []
  6.     for line in lines:
  7.         if len(line) > 0:
  8.             packets.append(eval(line))
  9.    
  10.     def in_order(packet_1, packet_2):
  11.         elements = zip(packet_1, packet_2)
  12.         for a, b in elements:
  13.             # both values are list
  14.             if isinstance(a, list) and isinstance(b, list):  
  15.                 c = in_order(a,b)
  16.                 if c == 1 or c == -1:
  17.                     return c
  18.              
  19.             # only left value is list, convert right side to list too
  20.             elif isinstance(a, list) and not isinstance(b, list):
  21.                 b = [b]
  22.                 c = in_order(a, b)
  23.                 if c == 1 or c == -1:
  24.                     return c  
  25.             # only right value is list
  26.             elif not isinstance(a, list) and isinstance(b, list):
  27.                 a = [a]
  28.                 c = in_order(a,b)
  29.                 if c == 1 or c == -1:
  30.                     return c
  31.             # both are integers
  32.             else:
  33.                 c = basic_compare(a, b)
  34.                 if c == 1 or c == -1:
  35.                     return c
  36.                    
  37.         # can't conclude after comparing all elements, need check length
  38.         if len(packet_1) < len(packet_2):
  39.             return 1
  40.         elif len(packet_1) > len(packet_2):
  41.             return -1
  42.         else:
  43.             return 0
  44.      
  45.     def basic_compare(a,b):
  46.         if a < b:
  47.             return 1
  48.         elif a > b:
  49.             return -1
  50.         return 0
  51.    
  52.     def part_1():
  53.         index = 1
  54.         res = 0
  55.         while len(packets) > 0:
  56.             packet_1 = packets.pop(0)
  57.             packet_2 = packets.pop(0)
  58.  
  59.             if in_order(packet_1, packet_2) >= 0:
  60.                 res += index
  61.             index += 1
  62.         return res
  63.    
  64.     def part_2():
  65.         packets.append([[2]])
  66.         packets.append([[6]])
  67.         sorted_packets = sorted(packets, key=functools.cmp_to_key(in_order), reverse = True)
  68.         index_1 = sorted_packets.index([[2]]) + 1
  69.         index_2 = sorted_packets.index([[6]]) + 1
  70.         return index_1 * index_2
  71.      
  72.     print("Part 1: {}".format(part_1()))
  73.     print("Part 2: {}".format(part_2()))
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement