aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-04-21 19:22:47 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-04-21 19:22:47 +0800
commit1b5efbb1a8d71b9fc2668315229370a26e0e9d18 (patch)
tree91b94679b1429e1ef0660830b63913362bc0498a /src
parent09d7a8a34030b49d2316538949ad84668c42b8ca (diff)
downloadadvent-of-code-1b5efbb1a8d71b9fc2668315229370a26e0e9d18.tar.gz
advent-of-code-1b5efbb1a8d71b9fc2668315229370a26e0e9d18.zip
interrupt computer
Diffstat (limited to 'src')
-rw-r--r--src/2019/day5/aoc.cpp14
-rw-r--r--src/2019/day5/aoc.h5
-rw-r--r--src/2019/day7/aoc.cpp2
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");
}