diff options
Diffstat (limited to '2019/day05.c')
-rw-r--r-- | 2019/day05.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/2019/day05.c b/2019/day05.c index 3b38124..ec8c471 100644 --- a/2019/day05.c +++ b/2019/day05.c @@ -1,13 +1,6 @@ #include <stdio.h> #include <stdlib.h> - -static int input(void) { - return 1; -} - -static void output(int x) { - printf("%d\n", x); -} +#include <string.h> static int ip; static int mem[1024]; @@ -16,7 +9,7 @@ static int *p(int mode, int param) { return (mode ? &mem[ip + param] : &mem[mem[ip + param]]); } -static void run(void) { +static void run(int input) { while (mem[ip] != 99) { int op = mem[ip] % 100; int m1 = mem[ip] / 100 % 10; @@ -25,14 +18,23 @@ static void run(void) { switch (op) { break; case 1: *p(m3, 3) = *p(m1, 1) + *p(m2, 2); ip += 4; break; case 2: *p(m3, 3) = *p(m1, 1) * *p(m2, 2); ip += 4; - break; case 3: *p(m1, 1) = input(); ip += 2; - break; case 4: output(*p(m1, 1)); ip += 2; + break; case 3: *p(m1, 1) = input; ip += 2; + break; case 4: printf("%d\n", *p(m1, 1)); ip += 2; + break; case 5: ip = (*p(m1, 1) ? *p(m2, 2) : ip + 3); + break; case 6: ip = (*p(m1, 1) ? ip + 3 : *p(m2, 2)); + break; case 7: *p(m3, 3) = (*p(m1, 1) < *p(m2, 2)); ip += 4; + break; case 8: *p(m3, 3) = (*p(m1, 1) == *p(m2, 2)); ip += 4; break; default: abort(); } } } int main(void) { - for (int i = 0; EOF != scanf("%d,", &mem[i]); ++i); - run(); + int a[1024]; + for (int i = 0; EOF != scanf("%d,", &a[i]); ++i); + memcpy(mem, a, sizeof(mem)); + run(1); + memcpy(mem, a, sizeof(mem)); + ip = 0; + run(5); } |