Advertisement
Guest User

2023_20 RT

a guest
May 16th, 2025
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.71 KB | None | 0 0
  1. def part1(mod_config: dict, steps: int = 1000) -> int:
  2.     ff_modules = {k: 0 for k, v in mod_config.items() if v[0] == "%"}
  3.     c_modules_start = defaultdict(
  4.         dict
  5.     )  # keeps the start values of Conjunction modules before button push
  6.     for c in (k for k, v in mod_config.items() if v[0] == "&"):
  7.         for k, v in mod_config.items():
  8.             if c in v[1]:
  9.                 c_modules_start[c].update({k: 0})
  10.  
  11.     pulses = defaultdict(int)
  12.     rx_switches = defaultdict(set)
  13.     c_modules = {}  # here all states for C modules are kept in deque
  14.  
  15.     for idx in range(steps):
  16.         deq = deque(["broadcaster"])
  17.         while deq:
  18.             current = deq.popleft()
  19.             if current == "broadcaster":
  20.                 pulse = False
  21.                 pulses[pulse] += 1
  22.             elif mod_config[current][0] == "%":
  23.                 pulse = ff_modules[current]
  24.             else:
  25.                 # here I take the first state of the C module. If it's the last int the deque it's kept separetely
  26.                 cur_c_module = c_modules[current].popleft()
  27.                 if not c_modules[current]:
  28.                     c_modules_start[current] = cur_c_module
  29.                 pulse = not all(cur_c_module.values())
  30.             for item in mod_config[current][1]:
  31.                 pulses[pulse] += 1
  32.                 if item not in mod_config:
  33.                     # print(f"output pulse is {pulse}")
  34.                     if item == "rx":
  35.                         if any(cur_c_module.values()):
  36.                             rx_switches[
  37.                                 next(k for k, v in cur_c_module.items() if v)
  38.                             ].add(idx + 1)
  39.                             print(rx_switches)
  40.                             # if len(rx_switches) == 4:
  41.                             #    return lcm(*set.union(*rx_switches.values()))
  42.                     continue
  43.                 if mod_config[item][0] == "%":
  44.                     if pulse:
  45.                         continue
  46.                     ff_modules[item] = not ff_modules[item]
  47.                 else:
  48.                     # here we update states of the C module. If this state is the first it is based on the last state before button push
  49.                     if c_modules.get(item, None):
  50.                         c_modules[item].append(c_modules[item][-1].copy())
  51.                     else:
  52.                         c_modules[item] = deque([c_modules_start[item]])
  53.                     c_modules[item][-1][current] = pulse
  54.                 deq.append(item)
  55.             # print(f"{ff_modules=}, {c_modules=}")
  56.     """
  57.    for v in rx_switches.values():
  58.        print([y - x for x, y in pairwise(sorted(v))])
  59.        """
  60.     return prod(pulses.values())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement