day02.c (1829B)
1 #include <stdio.h> 2 #include <inttypes.h> 3 #include <string.h> 4 #include "cputime.h" 5 6 #define MAX_LEN 256 7 8 typedef struct { 9 char data[16]; 10 int len; 11 } Buffer; 12 13 typedef int Program[MAX_LEN]; 14 15 int btoi(Buffer buf) { 16 int num = 0; 17 for (int i=0;i<buf.len;++i) num = num*10+buf.data[i]; 18 return num; 19 } 20 21 void program_print(const Program prg) { 22 for (int i=0;i<MAX_LEN;++i) { 23 printf("%d,", prg[i]); 24 } 25 printf("\n"); 26 } 27 28 int program_step(Program prg, int ip) { 29 int opcode = prg[ip]; 30 switch (opcode) { 31 case 1: { // addition 32 prg[prg[ip+3]] = prg[prg[ip+1]] + prg[prg[ip+2]]; 33 return ip+4; 34 } 35 case 2: { // multiplication 36 prg[prg[ip+3]] = prg[prg[ip+1]] * prg[prg[ip+2]]; 37 return ip+4; 38 } 39 case 99: return -1; // halt 40 } 41 return -2; 42 } 43 44 int program_run(const Program prg1, int noun, int verb) { 45 Program prg = {0}; 46 memcpy(prg, prg1, MAX_LEN*sizeof(prg[0])); 47 int ip = 0; 48 prg[1] = noun; 49 prg[2] = verb; 50 for (ip=0; ip!=-1&&ip<MAX_LEN; ip=program_step(prg, ip)) { 51 if (ip==-2) { 52 printf("invalid opcode\n"); 53 return 0; 54 } 55 } 56 return prg[0]; 57 } 58 59 int main(void) { 60 Program prg = {0}; 61 int ip = 0; 62 Buffer buf = {0}; 63 for (int c=getchar();c!=EOF;c=getchar()) { 64 if (c>='0'&&c<='9') { 65 buf.data[buf.len++] = c-'0'; 66 } else { 67 prg[ip++] = btoi(buf); 68 buf.len = 0; 69 } 70 } 71 int p1 = program_run(prg, 12, 2); 72 int p2 = 0; 73 for (int noun=0; noun<100; ++noun) { 74 for (int verb=0; verb<100; ++verb) { 75 if (program_run(prg, noun, verb) == 19690720) { 76 p2 = 100*noun+verb; 77 goto fin; 78 } 79 } 80 } 81 fin: 82 printf("p1: %d\np2: %d\n", p1, p2); 83 return 0; 84 }