summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-12-06 03:16:13 -0500
committerJune McEnroe <june@causal.agency>2020-11-22 00:14:26 -0500
commitfb84fd04675c2b6c7e283f07ee3771b03e49d87b (patch)
tree3ba2805da2420782d0369139a48347d4408fc0d0
parentSolve day 5 part 1 (diff)
downloadaoc-fb84fd04675c2b6c7e283f07ee3771b03e49d87b.tar.gz
aoc-fb84fd04675c2b6c7e283f07ee3771b03e49d87b.zip
Solve day 5 part 2
-rw-r--r--2019/day05.c28
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);
 }