summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--2018/day19.c78
1 files changed, 69 insertions, 9 deletions
diff --git a/2018/day19.c b/2018/day19.c
index 5802ffa..eed25e1 100644
--- a/2018/day19.c
+++ b/2018/day19.c
@@ -88,25 +88,85 @@ int main(void) {
 
 	uint len = 0;
 	struct Ins {
-		char op[4];
-		uint a, b, c;
+		uint op, a, b, c;
 	} prog[50];
 	while (!feof(stdin)) {
+		char code[4];
 		scanf(
 			"%4c %u %u %u\n",
-			prog[len].op, &prog[len].a, &prog[len].b, &prog[len].c
+			code, &prog[len].a, &prog[len].b, &prog[len].c
 		);
+		for (uint i = 0; i < 16; ++i) {
+			if (strncmp(code, Ops[i].name, 4)) continue;
+			prog[len].op = i;
+			break;
+		}
 		len++;
 	}
 
 	while (cpu.r[cpu.ip] < len) {
 		struct Ins ins = prog[cpu.r[cpu.ip]];
-		for (uint i = 0; i < 16; ++i) {
-			if (strncmp(ins.op, Ops[i].name, 4)) continue;
-			cpu = Ops[i].fn(cpu, ins.a, ins.b, ins.c);
-			cpu.r[cpu.ip]++;
-			break;
-		}
+		cpu = Ops[ins.op].fn(cpu, ins.a, ins.b, ins.c);
+		cpu.r[cpu.ip]++;
 	}
 	printf("%u\n", cpu.r[0]);
+
+	/*
+	00:	addi	ip	16	ip	goto 17
+	01:	seti	1	_	r5	r5 = 1
+	02:	seti	1	_	r3	r3 = 1
+	03:	mulr	r5	r3	r2	r2 = r5 * r3
+	04:	eqrr	r2	r4	r2	r2 = (r2 == r4)
+	05:	addr	r2	ip	ip	if r2 goto 7 else goto 6
+	06:	addi	ip	1	ip	goto 8
+	07:	addr	r5	r0	r0	r0 += r5
+	08:	addi	r3	1	r3	r3 += 1
+	09:	gtrr	r3	r4	r2	r2 = (r3 > r4)
+	10:	addr	ip	r2	ip	if r2 goto 12 else goto 11
+	11:	seti	2	_	ip	goto 3
+	12:	addi	r5	1	r5	r5 += 1
+	13:	gtrr	r5	r4	r2	r2 = (r5 > r4)
+	14:	addr	r2	ip	ip	if r2 goto 16 else goto 15
+	15:	seti	1	_	ip	goto 2
+	16:	mulr	ip	ip	ip	halt
+	17:	addi	r4	2	r4	r4 += 2
+	18:	mulr	r4	r4	r4	r4 *= r4
+	19:	mulr	ip	r4	r4	r4 *= 19
+	20:	muli	r4	11	r4	r4 *= 11
+	21:	addi	r2	5	r2	r2 += 5
+	22:	mulr	r2	ip	r2	r2 *= 22
+	23:	addi	r2	12	r2	r2 += 12
+	24:	addr	r4	r2	r4	r4 += r2
+	25:	addr	ip	r0	ip	if r0 goto 27 else goto 26
+	26:	seti	0	_	ip	goto 1
+	27:	setr	ip	_	r2	r2 = 27
+	28:	mulr	r2	ip	r2	r2 *= 28
+	29:	addr	ip	r2	r2	r2 += 29
+	30:	mulr	ip	r2	r2	r2 *= 30
+	31:	muli	r2	14	r2	r2 *= 14
+	32:	mulr	r2	ip	r2	r2 *= 32
+	33:	addr	r4	r2	r4	r4 += r2
+	34:	seti	0	_	r0	r0 = 0
+	35:	seti	0	_	ip	goto 1
+	*/
+
+#if 0
+	uint sum = 0;
+	uint big = 10551358;
+	for (uint a = 1; a <= big; a++) {
+		for (uint b = 1; b <= big; b++) {
+			if (a * b == big) sum += a;
+		}
+	}
+	printf("%u\n", r0);
+#endif
+
+	uint big = 10551358;
+	uint sum = 1 + big;
+	for (uint f = 2; big > 1; ++f) {
+		if (big % f) continue;
+		sum += f;
+		big /= f;
+	}
+	printf("%u\n", sum);
 }