diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-04-21 19:22:47 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-04-21 19:22:47 +0800 |
commit | 1b5efbb1a8d71b9fc2668315229370a26e0e9d18 (patch) | |
tree | 91b94679b1429e1ef0660830b63913362bc0498a /src | |
parent | 09d7a8a34030b49d2316538949ad84668c42b8ca (diff) | |
download | advent-of-code-1b5efbb1a8d71b9fc2668315229370a26e0e9d18.tar.gz advent-of-code-1b5efbb1a8d71b9fc2668315229370a26e0e9d18.zip |
interrupt computer
Diffstat (limited to 'src')
-rw-r--r-- | src/2019/day5/aoc.cpp | 14 | ||||
-rw-r--r-- | src/2019/day5/aoc.h | 5 | ||||
-rw-r--r-- | src/2019/day7/aoc.cpp | 2 |
3 files changed, 15 insertions, 6 deletions
diff --git a/src/2019/day5/aoc.cpp b/src/2019/day5/aoc.cpp index d9c3cd0..cf2f65c 100644 --- a/src/2019/day5/aoc.cpp +++ b/src/2019/day5/aoc.cpp @@ -84,14 +84,18 @@ static size_t opt8(std::vector<int>& codes, std::vector<int>& outputs, size_t i, } typedef size_t (*opt_f)(std::vector<int>&, std::vector<int>&, size_t, int, int); -static void run(size_t i, std::vector<int>& codes, std::vector<int>& outputs) { +static void run(size_t i, std::vector<int>& codes, std::vector<int>& outputs, interrupt_f f) { // printf("execute %d at %zu\n", codes[i], i); static opt_f opts[] = {opt1, opt2, opt3, opt4, opt5, opt6, opt7, opt8}; if (codes[i] != 99) { int m1{0}, m2{0}; int m = mode(codes[i], &m1, &m2); int x = opts[m - 1](codes, outputs, i, m1, m2); - run(x, codes, outputs); + if (f == nullptr) { + run(x, codes, outputs, f); + } else { + f(x, outputs); + } } } @@ -108,11 +112,13 @@ void set_computer(int* i) { int run_computer(std::vector<int> codes) { std::vector<int> outputs; - run(0, codes, outputs); + run(0, codes, outputs, nullptr); return outputs[outputs.size() - 1]; } -void run_computer(std::vector<int> codes, std::vector<int>& outputs) { run(0, codes, outputs); } +void run_computer(size_t i, std::vector<int> codes, std::vector<int>& outputs, interrupt_f f) { + run(i, codes, outputs, f); +} std::pair<int, int> day5(line_view file) { const char* p = file.line; diff --git a/src/2019/day5/aoc.h b/src/2019/day5/aoc.h index e92cd2e..a93de6e 100644 --- a/src/2019/day5/aoc.h +++ b/src/2019/day5/aoc.h @@ -7,6 +7,9 @@ namespace aoc2019 { void set_computer(int* i); int run_computer(std::vector<int> codes); -void run_computer(std::vector<int> codes, std::vector<int>&); + +typedef void (*interrupt_f)(size_t, std::vector<int>&); +void run_computer(size_t i, std::vector<int> codes, std::vector<int>&, interrupt_f); + std::pair<int, int> day5(line_view); } diff --git a/src/2019/day7/aoc.cpp b/src/2019/day7/aoc.cpp index d654a0c..8976f28 100644 --- a/src/2019/day7/aoc.cpp +++ b/src/2019/day7/aoc.cpp @@ -68,7 +68,7 @@ std::pair<int, int> day7(line_view file) { is2[1] = 33; set_computer(is2); std::vector<int> outputs; - run_computer(codes, outputs); + run_computer(0, codes, outputs, nullptr); std::for_each(outputs.begin(), outputs.end(), [](int x) { printf("%d ", x); }); printf("\n"); } |