Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- with open("2024_21input.txt", "r") as file:
- real_input = file.read()
- from collections import defaultdict
- robot_pad = {
- '^':(1,0),
- 'A':(2,0),
- '<':(0,1),
- 'v':(1,1),
- '>':(2,1),
- }
- door_pad = {
- '7':(0,0),
- '8':(1,0),
- '9':(2,0),
- '4':(0,1),
- '5':(1,1),
- '6':(2,1),
- '1':(0,2),
- '2':(1,2),
- '3':(2,2),
- '0':(1,3),
- 'A':(2,3),
- }
- orders_to_try = [""]
- while len(orders_to_try[0]) < 4:
- new_orders = []
- for char in "<>^v":
- for o in orders_to_try:
- if char not in o:
- new_orders.append(o+char)
- orders_to_try = new_orders
- orders_to_try = [o for o in orders_to_try if "^v" not in o and "<>" not in o]
- print(orders_to_try)
- codes = real_input.split("\n")
- def get_moves(pad, code, extras, default_add_order):
- x, y = pad["A"]
- c = defaultdict(int)
- for chunk in code:
- for char in chunk:
- x1, y1 = pad[char]
- xmove = x1 - x
- ymove = y1 - y
- if abs(xmove) + abs(ymove) == 0:
- extras += code[chunk]
- else:
- new_chunk = ""
- adding = {"<":0,">":0,"^":0,"v":0}
- if xmove > 0:
- adding[">"] += abs(xmove)
- else:
- adding["<"] += abs(xmove)
- if ymove > 0:
- adding["v"] += abs(ymove)
- else:
- adding["^"] += abs(ymove)
- add_order = default_add_order
- if pad == door_pad and xmove and ymove:
- if y == 3 and abs(xmove) == x:
- add_order = "^<"
- elif x == 0 and y + ymove == 3:
- add_order = ">v"
- elif pad == robot_pad and xmove and ymove:
- if y == 0 and abs(xmove) == x:
- add_order = "v><"
- elif x == 0:
- add_order = ">^"
- for a in add_order:
- if adding[a]:
- new_chunk += a
- extras += (adding[a] - 1) * code[chunk]
- new_chunk += "A"
- c[new_chunk] += code[chunk]
- x, y = x1, y1
- return c, extras
- counts = []
- for effort in orders_to_try:
- print(effort)
- count = 0
- for c in codes:
- extras = 0
- code = defaultdict(int)
- code[c] += 1
- robot_3_moves, extras = get_moves(door_pad, code, extras, effort)
- #print(robot_3_moves, extras)
- for extra_robot in range(25):
- robot_3_moves, extras = get_moves(robot_pad, robot_3_moves, extras, effort)
- complexity = (sum([len(v) * robot_3_moves[v] for v in robot_3_moves]) + extras) * int(c[:-1])
- count += complexity
- print(code, complexity)
- counts.append(count)
- print(min(counts))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement