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