advent2019

Advent of Code 2019 (C99)
git clone git://bsandro.tech/advent2019
Log | Files | Refs | LICENSE

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 }