💓 - 2023 DAY 20 SOLUTIONS - 💓

Day 20: Pulse

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

cacheson, (edited )
cacheson avatar

Nim

Another least common multiple problem. I kinda don't like these, as it's not practical to solve them purely with code that operates on arbitrary inputs.

landreville,

Rust Solution

Memories of Day 8. It took me too long to realize I forgot to remove the 1000 iteration limit for part two.

hades,

Python

Also on Github


<span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">collections
</span><span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">math
</span><span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">re
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">from .</span><span style="color:#323232;">solver </span><span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">Solver
</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">class </span><span style="color:#0086b3;">Day20</span><span style="color:#323232;">(</span><span style="color:#0086b3;">Solver</span><span style="color:#323232;">):
</span><span style="color:#323232;">  modules: </span><span style="color:#0086b3;">dict</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">, </span><span style="color:#0086b3;">tuple</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">, </span><span style="color:#0086b3;">list</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">]]]
</span><span style="color:#323232;">  conjunction_inputs: </span><span style="color:#0086b3;">dict</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">, </span><span style="color:#0086b3;">set</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">]]
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#62a35c;">__init__</span><span style="color:#323232;">(self):
</span><span style="color:#323232;">    </span><span style="color:#62a35c;">super</span><span style="color:#323232;">().</span><span style="color:#62a35c;">__init__</span><span style="color:#323232;">(</span><span style="color:#0086b3;">20</span><span style="color:#323232;">)
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">presolve</span><span style="color:#323232;">(self, input: </span><span style="color:#0086b3;">str</span><span style="color:#323232;">):
</span><span style="color:#323232;">    self.modules </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">{}
</span><span style="color:#323232;">    self.conjunction_inputs </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">collections.defaultdict(</span><span style="color:#0086b3;">set</span><span style="color:#323232;">)
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">line </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#62a35c;">input</span><span style="color:#323232;">.splitlines():
</span><span style="color:#323232;">      m </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">re.fullmatch(</span><span style="font-weight:bold;color:#a71d5d;">r</span><span style="color:#183691;">'(</span><span style="color:#0086b3;">W</span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#183691;">)(</span><span style="color:#0086b3;">w</span><span style="font-weight:bold;color:#a71d5d;">+</span><span style="color:#183691;">) -> (</span><span style="color:#0086b3;">.</span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#183691;">)'</span><span style="color:#323232;">, line)
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">assert </span><span style="color:#323232;">m
</span><span style="color:#323232;">      kind, name, destinations </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">m.groups()
</span><span style="color:#323232;">      self.modules[name] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">(kind, destinations.split(</span><span style="color:#183691;">', '</span><span style="color:#323232;">))
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">source, (_, destinations) </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">self.modules.items():
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">destination, (kind, _) </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">((d, self.modules[d]) </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">d </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">d </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">self.modules):
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">kind </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">'&'</span><span style="color:#323232;">:
</span><span style="color:#323232;">          self.conjunction_inputs[destination].add(source)
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">_press_button</span><span style="color:#323232;">(self, flip_flops_on: </span><span style="color:#0086b3;">set</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">],
</span><span style="color:#323232;">                    conjunction_high_pulses: </span><span style="color:#0086b3;">dict</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">, </span><span style="color:#0086b3;">set</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">]]) -> </span><span style="color:#0086b3;">tuple</span><span style="color:#323232;">[</span><span style="color:#0086b3;">list</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">], </span><span style="color:#0086b3;">list</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">]]:
</span><span style="color:#323232;">    low_pulses: </span><span style="color:#0086b3;">list</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">    high_pulses: </span><span style="color:#0086b3;">list</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">    pulse: </span><span style="color:#0086b3;">list</span><span style="color:#323232;">[</span><span style="color:#0086b3;">tuple</span><span style="color:#323232;">[</span><span style="color:#0086b3;">str</span><span style="color:#323232;">, </span><span style="color:#0086b3;">str</span><span style="color:#323232;">, </span><span style="color:#0086b3;">int</span><span style="color:#323232;">]] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[(</span><span style="color:#183691;">''</span><span style="color:#323232;">, </span><span style="color:#183691;">'broadcaster'</span><span style="color:#323232;">, </span><span style="color:#0086b3;">0</span><span style="color:#323232;">)]
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">while </span><span style="color:#323232;">pulse:
</span><span style="color:#323232;">      origin, source, value </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">pulse.pop(</span><span style="color:#0086b3;">0</span><span style="color:#323232;">)
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">value </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#0086b3;">0</span><span style="color:#323232;">:
</span><span style="color:#323232;">        low_pulses.append(source)
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">else</span><span style="color:#323232;">:
</span><span style="color:#323232;">        high_pulses.append(source)
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">source </span><span style="font-weight:bold;color:#a71d5d;">not in </span><span style="color:#323232;">self.modules:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">continue
</span><span style="color:#323232;">      kind, destinations </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">self.modules[source]
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">source </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">'broadcaster'</span><span style="color:#323232;">:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">d </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations:
</span><span style="color:#323232;">          pulse.append((source, d, value))
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">elif </span><span style="color:#323232;">kind </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">'%' </span><span style="font-weight:bold;color:#a71d5d;">and </span><span style="color:#323232;">value </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#0086b3;">0</span><span style="color:#323232;">:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">source </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">flip_flops_on:
</span><span style="color:#323232;">          flip_flops_on.remove(source)
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">d </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations:
</span><span style="color:#323232;">            pulse.append((source, d, </span><span style="color:#0086b3;">0</span><span style="color:#323232;">))
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">else</span><span style="color:#323232;">:
</span><span style="color:#323232;">          flip_flops_on.add(source)
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">d </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations:
</span><span style="color:#323232;">            pulse.append((source, d, </span><span style="color:#0086b3;">1</span><span style="color:#323232;">))
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">elif </span><span style="color:#323232;">kind </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">'&'</span><span style="color:#323232;">:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">value:
</span><span style="color:#323232;">          conjunction_high_pulses[source].add(origin)
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">elif </span><span style="color:#323232;">origin </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">conjunction_high_pulses[source]:
</span><span style="color:#323232;">          conjunction_high_pulses[source].remove(origin)
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">conjunction_high_pulses[source] </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#323232;">self.conjunction_inputs[source]:
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">d </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations:
</span><span style="color:#323232;">            pulse.append((source, d, </span><span style="color:#0086b3;">0</span><span style="color:#323232;">))
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">else</span><span style="color:#323232;">:
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">d </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations:
</span><span style="color:#323232;">            pulse.append((source, d, </span><span style="color:#0086b3;">1</span><span style="color:#323232;">))
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">low_pulses, high_pulses
</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">solve_first_star</span><span style="color:#323232;">(self) -> </span><span style="color:#0086b3;">int</span><span style="color:#323232;">:
</span><span style="color:#323232;">    flip_flops_on </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">set</span><span style="color:#323232;">()
</span><span style="color:#323232;">    conjunction_high_pulses </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">collections.defaultdict(</span><span style="color:#0086b3;">set</span><span style="color:#323232;">)
</span><span style="color:#323232;">    low_pulse_count </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">0
</span><span style="color:#323232;">    high_pulse_count </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">0
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">_ </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#62a35c;">range</span><span style="color:#323232;">(</span><span style="color:#0086b3;">1000</span><span style="color:#323232;">):
</span><span style="color:#323232;">      low, high </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">self._press_button(flip_flops_on, conjunction_high_pulses)
</span><span style="color:#323232;">      low_pulse_count </span><span style="font-weight:bold;color:#a71d5d;">+= </span><span style="color:#62a35c;">len</span><span style="color:#323232;">(low)
</span><span style="color:#323232;">      high_pulse_count </span><span style="font-weight:bold;color:#a71d5d;">+= </span><span style="color:#62a35c;">len</span><span style="color:#323232;">(high)
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">low_pulse_count</span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#323232;">high_pulse_count
</span><span style="color:#323232;">
</span><span style="color:#323232;">  </span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">solve_second_star</span><span style="color:#323232;">(self) -> </span><span style="color:#0086b3;">int</span><span style="color:#323232;">:
</span><span style="color:#323232;">    flip_flops_on </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">set</span><span style="color:#323232;">()
</span><span style="color:#323232;">    conjunction_high_pulses </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">collections.defaultdict(</span><span style="color:#0086b3;">set</span><span style="color:#323232;">)
</span><span style="color:#323232;">    button_count </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">0
</span><span style="color:#323232;">    rx_upstream </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[module </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">module, (_, destinations) </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">self.modules.items() </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#183691;">'rx' </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations]
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#62a35c;">len</span><span style="color:#323232;">(rx_upstream) </span><span style="font-weight:bold;color:#a71d5d;">!= </span><span style="color:#0086b3;">1</span><span style="color:#323232;">:
</span><span style="color:#323232;">      rx_upstream </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">else</span><span style="color:#323232;">:
</span><span style="color:#323232;">      rx_upstream </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[module </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">module, (_, destinations) </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">self.modules.items() </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">rx_upstream[</span><span style="color:#0086b3;">0</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">destinations]
</span><span style="color:#323232;">    rx_upstream_periods </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[</span><span style="color:#0086b3;">None</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#62a35c;">len</span><span style="color:#323232;">(rx_upstream)
</span><span style="color:#323232;">    low_pulses </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">while </span><span style="color:#183691;">'rx' </span><span style="font-weight:bold;color:#a71d5d;">not in </span><span style="color:#323232;">low_pulses </span><span style="font-weight:bold;color:#a71d5d;">and </span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">not </span><span style="color:#323232;">rx_upstream </span><span style="font-weight:bold;color:#a71d5d;">or not </span><span style="color:#62a35c;">all</span><span style="color:#323232;">(rx_upstream_periods)):
</span><span style="color:#323232;">      button_count </span><span style="font-weight:bold;color:#a71d5d;">+= </span><span style="color:#0086b3;">1
</span><span style="color:#323232;">      low_pulses, _ </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">self._press_button(flip_flops_on, conjunction_high_pulses)
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">module, periods </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#62a35c;">zip</span><span style="color:#323232;">(rx_upstream, rx_upstream_periods, strict</span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#0086b3;">True</span><span style="color:#323232;">):
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">periods </span><span style="font-weight:bold;color:#a71d5d;">is not </span><span style="color:#0086b3;">None</span><span style="color:#323232;">:
</span><span style="color:#323232;">          </span><span style="font-weight:bold;color:#a71d5d;">continue
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">module </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">low_pulses:
</span><span style="color:#323232;">          rx_upstream_periods[rx_upstream.index(module)] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">button_count
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#183691;">'rx' </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">low_pulses:
</span><span style="color:#323232;">      </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">button_count
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">math.lcm(</span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;">rx_upstream_periods)
</span>
cvttsd2si, (edited )

C++, kind of

Ok so this is a little weird. My code for task1 is attached to this comment, but I actually solved task2 by hand. After checking that bruteforce indeed takes longer than a second, I plotted the graph just to see what was going on, and you can immediately tell that the result is the least common multiple of four numbers, which can easily be obtained by running task1 with a debugger, and maybe read directly from the graph as well. I also pre-broke my include statements, so hopefully the XSS protection isn’t completely removing them again.

My graph: files.catbox.moe/1u4daw.png

blue is the broadcaster/button, yellows are flipflops, purples are nand gates and green is the output gate.

Also I abandoned scala again, because there is so much state modification going on.


<span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> fstream>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> memory>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> algorithm>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> optional>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> stdexcept>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> set>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> vector>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> map>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> deque>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> unordered_map>
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> fmt/format.h>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> fmt/ranges.h>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> flux.hpp>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> scn/all.h>
</span><span style="font-weight:bold;color:#a71d5d;">#include</span><span style="color:#323232;"> scn/scan/list.h>
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">enum </span><span style="color:#323232;">Pulse { Low</span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#0086b3;">0</span><span style="color:#323232;">, High };
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">struct </span><span style="color:#323232;">Module {
</span><span style="color:#323232;">    std::string name;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#795da3;">Module</span><span style="color:#323232;">(std::string _name) : name(std::move(_name)) {}
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">virtual</span><span style="color:#323232;"> std::optional </span><span style="font-weight:bold;color:#795da3;">handle</span><span style="color:#323232;">(Module </span><span style="font-weight:bold;color:#a71d5d;">const&</span><span style="color:#323232;">amp; from, Pulse type) </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">0</span><span style="color:#323232;">;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">virtual </span><span style="font-weight:bold;color:#795da3;">~Module</span><span style="color:#323232;">() </span><span style="font-weight:bold;color:#a71d5d;">= default</span><span style="color:#323232;">;
</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">struct </span><span style="color:#323232;">FlipFlop : </span><span style="font-weight:bold;color:#a71d5d;">public </span><span style="color:#0086b3;">Module </span><span style="color:#323232;">{
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">using</span><span style="color:#323232;"> Module::Module;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">bool</span><span style="color:#323232;"> on </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">false</span><span style="color:#323232;">;
</span><span style="color:#323232;">    std::optional </span><span style="font-weight:bold;color:#795da3;">handle</span><span style="color:#323232;">([[maybe_unused]] Module </span><span style="font-weight:bold;color:#a71d5d;">const&</span><span style="color:#323232;">amp; from, Pulse type) </span><span style="font-weight:bold;color:#a71d5d;">override </span><span style="color:#323232;">{
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;">(type </span><span style="font-weight:bold;color:#a71d5d;">==</span><span style="color:#323232;"> Low) {
</span><span style="color:#323232;">            on </span><span style="font-weight:bold;color:#a71d5d;">= !</span><span style="color:#323232;">on;
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> on </span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#323232;"> High </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> Low;
</span><span style="color:#323232;">        }
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">{};
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">virtual </span><span style="font-weight:bold;color:#795da3;">~FlipFlop</span><span style="color:#323232;">() </span><span style="font-weight:bold;color:#a71d5d;">= default</span><span style="color:#323232;">;
</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">struct </span><span style="color:#323232;">Nand : </span><span style="font-weight:bold;color:#a71d5d;">public </span><span style="color:#0086b3;">Module </span><span style="color:#323232;">{
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">using</span><span style="color:#323232;"> Module::Module;
</span><span style="color:#323232;">    std::unordered_map last;
</span><span style="color:#323232;">    std::optional </span><span style="font-weight:bold;color:#795da3;">handle</span><span style="color:#323232;">(Module </span><span style="font-weight:bold;color:#a71d5d;">const&</span><span style="color:#323232;">amp; from, Pulse type) </span><span style="font-weight:bold;color:#a71d5d;">override </span><span style="color:#323232;">{
</span><span style="color:#323232;">        last[from.name] </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> type;
</span><span style="color:#323232;">
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto&</span><span style="color:#323232;">amp; [k, v] </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> last) {
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">(v </span><span style="font-weight:bold;color:#a71d5d;">==</span><span style="color:#323232;"> Low) {
</span><span style="color:#323232;">                </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> High;
</span><span style="color:#323232;">            }
</span><span style="color:#323232;">        }
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> Low;
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">virtual </span><span style="font-weight:bold;color:#795da3;">~Nand</span><span style="color:#323232;">() </span><span style="font-weight:bold;color:#a71d5d;">= default</span><span style="color:#323232;">;
</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">struct </span><span style="color:#323232;">Broadcaster : </span><span style="font-weight:bold;color:#a71d5d;">public </span><span style="color:#0086b3;">Module </span><span style="color:#323232;">{
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">using</span><span style="color:#323232;"> Module::Module;
</span><span style="color:#323232;">    std::optional </span><span style="font-weight:bold;color:#795da3;">handle</span><span style="color:#323232;">([[maybe_unused]] Module </span><span style="font-weight:bold;color:#a71d5d;">const&</span><span style="color:#323232;">amp; from, Pulse type) </span><span style="font-weight:bold;color:#a71d5d;">override </span><span style="color:#323232;">{
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> type;
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">virtual </span><span style="font-weight:bold;color:#795da3;">~Broadcaster</span><span style="color:#323232;">() </span><span style="font-weight:bold;color:#a71d5d;">= default</span><span style="color:#323232;">;
</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">struct </span><span style="color:#323232;">Sink : </span><span style="font-weight:bold;color:#a71d5d;">public </span><span style="color:#0086b3;">Module </span><span style="color:#323232;">{
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">using</span><span style="color:#323232;"> Module::Module;
</span><span style="color:#323232;">    std::optional </span><span style="font-weight:bold;color:#795da3;">handle</span><span style="color:#323232;">([[maybe_unused]] Module </span><span style="font-weight:bold;color:#a71d5d;">const&</span><span style="color:#323232;">amp; from, Pulse type) </span><span style="font-weight:bold;color:#a71d5d;">override </span><span style="color:#323232;">{
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">{};
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">virtual </span><span style="font-weight:bold;color:#795da3;">~Sink</span><span style="color:#323232;">() </span><span style="font-weight:bold;color:#a71d5d;">= default</span><span style="color:#323232;">;
</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">struct </span><span style="color:#323232;">Button : </span><span style="font-weight:bold;color:#a71d5d;">public </span><span style="color:#0086b3;">Module </span><span style="color:#323232;">{
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">using</span><span style="color:#323232;"> Module::Module;
</span><span style="color:#323232;">    std::optional </span><span style="font-weight:bold;color:#795da3;">handle</span><span style="color:#323232;">([[maybe_unused]] Module </span><span style="font-weight:bold;color:#a71d5d;">const&</span><span style="color:#323232;">amp; from, Pulse type) </span><span style="font-weight:bold;color:#a71d5d;">override </span><span style="color:#323232;">{
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">throw</span><span style="color:#323232;"> std::runtime_error{</span><span style="color:#183691;">"Button should never recv signal"</span><span style="color:#323232;">};
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">virtual </span><span style="font-weight:bold;color:#795da3;">~Button</span><span style="color:#323232;">() </span><span style="font-weight:bold;color:#a71d5d;">= default</span><span style="color:#323232;">;
</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">void </span><span style="font-weight:bold;color:#795da3;">run</span><span style="color:#323232;">(Module</span><span style="font-weight:bold;color:#a71d5d;">* </span><span style="color:#323232;">button, std::map</span><span style="font-weight:bold;color:#a71d5d;">> </span><span style="color:#323232;">connections, </span><span style="font-weight:bold;color:#a71d5d;">long&</span><span style="color:#323232;">amp; lows, </span><span style="font-weight:bold;color:#a71d5d;">long&</span><span style="color:#323232;">amp; highs) {
</span><span style="color:#323232;">    std::deque</span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;"> pending;
</span><span style="color:#323232;">    pending.push_back({button, Low});
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">while</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">!</span><span style="color:#323232;">pending.empty()) {
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">auto </span><span style="color:#323232;">[m, p] </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> pending.front();
</span><span style="color:#323232;">        pending.pop_front();
</span><span style="color:#323232;">
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto&</span><span style="color:#323232;">amp; m2 </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> connections.at(m->name)) {
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">++</span><span style="color:#323232;">(p </span><span style="font-weight:bold;color:#a71d5d;">==</span><span style="color:#323232;"> Low </span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#323232;"> lows </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> highs);
</span><span style="color:#323232;">            fmt::println(</span><span style="color:#183691;">"{} -{}-> {}"</span><span style="color:#323232;">, m->name, p </span><span style="font-weight:bold;color:#a71d5d;">==</span><span style="color:#323232;"> Low </span><span style="font-weight:bold;color:#a71d5d;">? </span><span style="color:#183691;">"low"</span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#183691;">"high"</span><span style="color:#323232;">, m2->name);
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> p2 </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> m2->handle(</span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;">m, p)) {
</span><span style="color:#323232;">                pending.push_back({m2, </span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;">p2});
</span><span style="color:#323232;">            }
</span><span style="color:#323232;">        }
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">}
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">struct </span><span style="color:#323232;">Setup {
</span><span style="color:#323232;">    std::vector</span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;"> modules;
</span><span style="color:#323232;">    std::map by_name;
</span><span style="color:#323232;">    std::map</span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;"> connections;
</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="color:#323232;">Setup </span><span style="font-weight:bold;color:#795da3;">parse</span><span style="color:#323232;">(std::string path) {
</span><span style="color:#323232;">    std::ifstream in(path);
</span><span style="color:#323232;">    Setup res;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> lines </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">flux::getlines(in).to</span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;">();
</span><span style="color:#323232;">
</span><span style="color:#323232;">    std::map</span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;"> pre_connections;
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">const auto&</span><span style="color:#323232;">amp; line </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> lines) {
</span><span style="color:#323232;">        std::string name;
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> r </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">scn::scan(line, </span><span style="color:#183691;">"{} -> "</span><span style="color:#323232;">, name)) {
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;">(name </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">"broadcaster"</span><span style="color:#323232;">) {
</span><span style="color:#323232;">                res.modules.push_back(std::make_unique(name));
</span><span style="color:#323232;">            } 
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">else if</span><span style="color:#323232;">(name.starts_with(</span><span style="color:#183691;">'%'</span><span style="color:#323232;">)) {
</span><span style="color:#323232;">                name </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> name.substr(</span><span style="color:#0086b3;">1</span><span style="color:#323232;">);
</span><span style="color:#323232;">                res.modules.push_back(std::make_unique(name));
</span><span style="color:#323232;">            }
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">else if</span><span style="color:#323232;">(name.starts_with(</span><span style="color:#183691;">'&amp;'</span><span style="color:#323232;">)) {
</span><span style="color:#323232;">                name </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> name.substr(</span><span style="color:#0086b3;">1</span><span style="color:#323232;">);
</span><span style="color:#323232;">                res.modules.push_back(std::make_unique(name));
</span><span style="color:#323232;">            }
</span><span style="color:#323232;">
</span><span style="color:#323232;">            res.by_name[name] </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> res.modules.back().get();
</span><span style="color:#323232;">
</span><span style="color:#323232;">            std::vector cons;
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> r2 </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">scn::scan_list_ex(r.range(), cons, scn::list_separator(</span><span style="color:#183691;">','</span><span style="color:#323232;">))) {
</span><span style="color:#323232;">                </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto&</span><span style="color:#323232;">amp; c </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> cons) </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;">(c.ends_with(</span><span style="color:#183691;">','</span><span style="color:#323232;">)) c.pop_back();
</span><span style="color:#323232;">                fmt::println(</span><span style="color:#183691;">"name={}, rest={}"</span><span style="color:#323232;">, name, cons);
</span><span style="color:#323232;">                pre_connections[name] </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> cons;
</span><span style="color:#323232;">            } </span><span style="font-weight:bold;color:#a71d5d;">else </span><span style="color:#323232;">{
</span><span style="color:#323232;">                </span><span style="font-weight:bold;color:#a71d5d;">throw</span><span style="color:#323232;"> std::runtime_error{r.error().msg()};
</span><span style="color:#323232;">            }
</span><span style="color:#323232;">        } </span><span style="font-weight:bold;color:#a71d5d;">else </span><span style="color:#323232;">{
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">throw</span><span style="color:#323232;"> std::runtime_error{r.error().msg()};
</span><span style="color:#323232;">        }
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">
</span><span style="color:#323232;">    res.modules.push_back(std::make_unique(</span><span style="color:#183691;">"sink"</span><span style="color:#323232;">));
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto&</span><span style="color:#323232;">amp; [k, v] </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> pre_connections) {
</span><span style="color:#323232;">        res.connections[k] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">flux::from(std::move(v)).map(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp; { 
</span><span style="color:#323232;">                </span><span style="font-weight:bold;color:#a71d5d;">try </span><span style="color:#323232;">{
</span><span style="color:#323232;">                    </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> res.by_name.at(s); 
</span><span style="color:#323232;">                } </span><span style="font-weight:bold;color:#a71d5d;">catch</span><span style="color:#323232;">(std::out_of_range </span><span style="font-weight:bold;color:#a71d5d;">const&</span><span style="color:#323232;">amp; e) {
</span><span style="color:#323232;">                    fmt::print(</span><span style="color:#183691;">"out of range at {}</span><span style="color:#0086b3;">n</span><span style="color:#183691;">"</span><span style="color:#323232;">, s);
</span><span style="color:#323232;">                    </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> res.modules.back().get();
</span><span style="color:#323232;">                }}).to</span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;">();
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">
</span><span style="color:#323232;">    res.modules.push_back(std::make_unique(</span><span style="color:#183691;">"button"</span><span style="color:#323232;">));
</span><span style="color:#323232;">    res.connections[</span><span style="color:#183691;">"button"</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">{res.by_name.at(</span><span style="color:#183691;">"broadcaster"</span><span style="color:#323232;">)};
</span><span style="color:#323232;">    res.connections[</span><span style="color:#183691;">"sink"</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">{};
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto&</span><span style="color:#323232;">amp; [m, cs] </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> res.connections) {
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto&</span><span style="color:#323232;">amp; m2 </span><span style="font-weight:bold;color:#a71d5d;">:</span><span style="color:#323232;"> cs) {
</span><span style="color:#323232;">            </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> nand </span><span style="font-weight:bold;color:#a71d5d;">= dynamic_cast</span><span style="color:#323232;">(m2)) {
</span><span style="color:#323232;">                nand->last[m] </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> Low;
</span><span style="color:#323232;">            </span><span style="background-color:#f5f5f5;font-weight:bold;color:#b52a1d;">}</span><span style="color:#323232;">
</span><span style="color:#323232;">        </span><span style="background-color:#f5f5f5;font-weight:bold;color:#b52a1d;">}</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="background-color:#f5f5f5;font-weight:bold;color:#b52a1d;">}</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return</span><span style="color:#323232;"> res;
</span><span style="background-color:#f5f5f5;font-weight:bold;color:#b52a1d;">}</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">int </span><span style="color:#323232;">main(</span><span style="font-weight:bold;color:#a71d5d;">int</span><span style="color:#323232;"> argc, </span><span style="font-weight:bold;color:#a71d5d;">char*</span><span style="color:#323232;"> argv[]) {
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">auto</span><span style="color:#323232;"> setup </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">parse(argc </span><span style="font-weight:bold;color:#a71d5d;">> </span><span style="color:#0086b3;">1 </span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#323232;"> argv[</span><span style="color:#0086b3;">1</span><span style="color:#323232;">] </span><span style="font-weight:bold;color:#a71d5d;">: </span><span style="color:#183691;">"../task1.txt"</span><span style="color:#323232;">);
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">long</span><span style="color:#323232;"> lows{}, highs{};
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">int</span><span style="color:#323232;"> i </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#0086b3;">0</span><span style="color:#323232;">; i </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">lt; </span><span style="color:#0086b3;">1000</span><span style="color:#323232;">; </span><span style="font-weight:bold;color:#a71d5d;">++</span><span style="color:#323232;">i)
</span><span style="color:#323232;">        run(setup.modules.back().get(), setup.connections, lows, highs);
</span><span style="color:#323232;">
</span><span style="color:#323232;">    fmt::println(</span><span style="color:#183691;">"task1: low={} high={} p={}"</span><span style="color:#323232;">, lows, highs, lows</span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;">highs);
</span><span style="color:#323232;">}
</span>

My graph: files.catbox.moe/1u4daw.png

blue is the broadcaster/button, yellows are flipflops, purples are nand gates and green is the output gate.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • advent_of_code@programming.dev
  • ngwrru68w68
  • rosin
  • GTA5RPClips
  • osvaldo12
  • love
  • Youngstown
  • slotface
  • khanakhh
  • everett
  • kavyap
  • mdbf
  • DreamBathrooms
  • thenastyranch
  • magazineikmin
  • anitta
  • InstantRegret
  • normalnudes
  • tacticalgear
  • cubers
  • ethstaker
  • modclub
  • cisconetworking
  • Durango
  • provamag3
  • tester
  • Leos
  • megavids
  • JUstTest
  • All magazines