AoC code coverage
Current view: top level - puzzles/2019 - Day07.cpp (source / functions) Coverage Total Hit
Test: master Lines: 100.0 % 48 48
Test Date: 2025-12-11 19:43:23 Functions: 100.0 % 7 7

            Line data    Source code
       1              : #include "Intcode.h"
       2              : #include "IntegerCast.h"
       3              : #include "PuzzleImpl.h"
       4              : 
       5              : #include <algorithm>
       6              : 
       7              : namespace {} // namespace
       8              : 
       9            1 : template <> std::string solvePart1<2019, 7>(std::string_view const input) {
      10            1 :   std::array<Computer, 5u> amplifiers = {{{input}, {input}, {input}, {input}, {input}}};
      11            1 :   std::array<int64_t, 5u> sequence = {0, 1, 2, 3, 4};
      12            1 :   auto const originalMemory = amplifiers.front().memdump();
      13            1 :   int64_t lastOutput = 0;
      14          120 :   amplifiers.back().registerOutput([&](int64_t v) { lastOutput = v; });
      15              : 
      16            5 :   for (size_t i = 1; i < amplifiers.size(); ++i)
      17          480 :     amplifiers[i - 1].registerOutput([&c = amplifiers[i]](int64_t v) { c.queueInput(v); });
      18              : 
      19            1 :   int64_t maxOutput = 0;
      20          120 :   do { // NOLINT
      21          720 :     for (size_t i = 0; i < amplifiers.size(); ++i) {
      22          600 :       amplifiers[i].reset(originalMemory);
      23          600 :       amplifiers[i].queueInput(sequence[i]);
      24          600 :     }
      25              : 
      26          120 :     amplifiers.front().queueInput(0);
      27              : 
      28          120 :     for (auto &amp : amplifiers)
      29          600 :       ASSERT(amp.run() == Computer::HALTED);
      30              : 
      31          120 :     maxOutput = std::max(maxOutput, lastOutput);
      32          120 :   } while (std::ranges::next_permutation(sequence).found);
      33            1 :   return std::to_string(maxOutput);
      34            1 : }
      35              : 
      36            1 : template <> std::string solvePart2<2019, 7>(std::string_view const input) {
      37            1 :   std::array<Computer, 5u> amplifiers = {{{input}, {input}, {input}, {input}, {input}}};
      38            1 :   std::array<int64_t, 5u> sequence = {5, 6, 7, 8, 9};
      39            1 :   auto const originalMemory = amplifiers.front().memdump();
      40            1 :   int64_t lastOutput = 0;
      41              : 
      42            5 :   for (size_t i = 1; i < amplifiers.size(); ++i)
      43         4800 :     amplifiers[i - 1].registerOutput([&c = amplifiers[i]](int64_t v) { c.queueInput(v); });
      44              : 
      45         1200 :   amplifiers.back().registerOutput([&](int64_t v) { lastOutput = v; });
      46         1200 :   amplifiers.back().registerOutput([&c = amplifiers.front()](int64_t v) { c.queueInput(v); });
      47              : 
      48            1 :   int64_t maxOutput = 0;
      49          120 :   do { // NOLINT
      50          720 :     for (size_t i = 0; i < amplifiers.size(); ++i) {
      51          600 :       amplifiers[i].reset(originalMemory);
      52          600 :       amplifiers[i].queueInput(sequence[i]);
      53          600 :     }
      54              : 
      55          120 :     amplifiers.front().queueInput(0);
      56              : 
      57          120 :     bool allHalted = false;
      58         1320 :     while (!allHalted) {
      59         1200 :       allHalted = true;
      60         1200 :       for (auto &amp : amplifiers)
      61         6000 :         if (amp.run() != Computer::HALTED)
      62         5400 :           allHalted = false;
      63         1200 :     }
      64              : 
      65          120 :     maxOutput = std::max(maxOutput, lastOutput);
      66          120 :   } while (std::ranges::next_permutation(sequence).found);
      67            1 :   return std::to_string(maxOutput);
      68            1 : }
        

Generated by: LCOV version 2.0-1