Advertisement
Guest User

Advent of Code 2024 Day 21 part 2

a guest
Jan 3rd, 2025
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.30 KB | None | 0 0
  1. with open("2024_21input.txt", "r") as file:
  2.     real_input = file.read()
  3.  
  4. from collections import defaultdict
  5.  
  6. robot_pad = {
  7.     '^':(1,0),
  8.     'A':(2,0),
  9.     '<':(0,1),
  10.     'v':(1,1),
  11.     '>':(2,1),
  12.     }
  13.    
  14. door_pad = {
  15.     '7':(0,0),
  16.     '8':(1,0),
  17.     '9':(2,0),
  18.     '4':(0,1),
  19.     '5':(1,1),
  20.     '6':(2,1),
  21.     '1':(0,2),
  22.     '2':(1,2),
  23.     '3':(2,2),
  24.     '0':(1,3),
  25.     'A':(2,3),
  26.     }
  27.  
  28. orders_to_try = [""]
  29. while len(orders_to_try[0]) < 4:
  30.     new_orders = []
  31.     for char in "<>^v":
  32.         for o in orders_to_try:
  33.             if char not in o:
  34.                 new_orders.append(o+char)
  35.     orders_to_try = new_orders
  36.     orders_to_try = [o for o in orders_to_try if "^v" not in o and "<>" not in o]
  37. print(orders_to_try)
  38.  
  39. codes = real_input.split("\n")
  40.  
  41. def get_moves(pad, code, extras, default_add_order):
  42.     x, y = pad["A"]
  43.    
  44.     c = defaultdict(int)
  45.    
  46.     for chunk in code:
  47.         for char in chunk:
  48.             x1, y1 = pad[char]
  49.             xmove = x1 - x
  50.             ymove = y1 - y
  51.             if abs(xmove) + abs(ymove) == 0:
  52.                 extras += code[chunk]
  53.             else:
  54.                 new_chunk = ""
  55.                 adding = {"<":0,">":0,"^":0,"v":0}
  56.                 if xmove > 0:
  57.                     adding[">"] += abs(xmove)
  58.                 else:
  59.                     adding["<"] += abs(xmove)
  60.                 if ymove > 0:
  61.                     adding["v"] += abs(ymove)
  62.                 else:
  63.                     adding["^"] += abs(ymove)
  64.                 add_order = default_add_order
  65.                 if pad == door_pad and xmove and ymove:
  66.                     if y == 3 and abs(xmove) == x:
  67.                         add_order = "^<"
  68.                     elif x == 0 and y + ymove == 3:
  69.                         add_order = ">v"
  70.                 elif pad == robot_pad and xmove and ymove:
  71.                     if y == 0 and abs(xmove) == x:
  72.                         add_order = "v><"
  73.                     elif x == 0:
  74.                         add_order = ">^"
  75.                 for a in add_order:
  76.                     if adding[a]:
  77.                         new_chunk += a
  78.                         extras += (adding[a] - 1) * code[chunk]
  79.                 new_chunk += "A"
  80.                 c[new_chunk] += code[chunk]
  81.                 x, y = x1, y1
  82.     return c, extras
  83.  
  84. counts = []
  85.  
  86. for effort in orders_to_try:
  87.     print(effort)
  88.     count = 0
  89.     for c in codes:
  90.         extras = 0
  91.         code = defaultdict(int)
  92.         code[c] += 1
  93.         robot_3_moves, extras = get_moves(door_pad, code, extras, effort)
  94.         #print(robot_3_moves, extras)
  95.         for extra_robot in range(25):
  96.             robot_3_moves, extras = get_moves(robot_pad, robot_3_moves, extras, effort)
  97.         complexity = (sum([len(v) * robot_3_moves[v] for v in robot_3_moves]) + extras) * int(c[:-1])
  98.         count += complexity
  99.         print(code, complexity)
  100.     counts.append(count)
  101.    
  102. print(min(counts))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement