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 & : 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 & : 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 : }
|