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

Generated by: LCOV version 2.0-1