Add day 2 part 2

[?]
Dec 31, 2019, 5:16 AM
Z2RPGTOWKRMA2YKUJGN3OOPJIKHBEHPKOXPYCJ6UFIXRGKIDM7EQC

Dependencies

Change contents

  • file addition: day2p2.c (----------)
    [2.7]
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <limits.h>
    typedef struct ll {
    int val;
    struct ll *nxt;
    } ll;
    int step(int *prog, int *pc);
    int* do_read(int *len);
    int ll_length(ll *head);
    ll* ll_read(void);
    void ll_free(ll *head);
    int* to_a(ll *head, int *len);
    void main(void) {
    int proglen = 0;
    int pc = 0;
    int *prog = NULL;
    int *run = NULL;
    int x = 0, y = 0;
    prog = do_read(&proglen);
    run = malloc(proglen * sizeof(int));
    for(int i = 0; i < INT_MAX; i++) {
    for(int j = 0; j <= i; j++) {
    int t = i == j ? 1 : 2;
    for(int s = 0; s < t; s++) {
    if(s) {
    x = j; y = i;
    } else {
    x = i; y = j;
    }
    memcpy(run, prog, proglen * sizeof(int));
    run[1] = x;
    run[2] = y;
    pc = 0;
    while(step(run, &pc)) {}
    if(run[0] == 19690720){
    printf("%d\n",100 * x + y);
    goto found;
    }
    }
    }
    }
    fprintf(stderr, "Solution not found\n");
    found:
    free(prog);
    free(run);
    }
    int step(int *prog, int *pc) {
    switch(prog[*pc]) {
    case 1:
    prog[prog[(*pc) + 3]] = prog[prog[(*pc) + 1]] + prog[prog[(*pc) + 2]];
    *pc += 4;
    return 1;
    case 2:
    prog[prog[(*pc) + 3]] = prog[prog[(*pc) + 1]] * prog[prog[(*pc) + 2]];
    *pc += 4;
    return 1;
    default:
    return 0;
    }
    }
    int* do_read(int *len) {
    ll* as_list = NULL;
    int *r = NULL;
    as_list = ll_read();
    r = to_a(as_list, len);
    ll_free(as_list);
    return r;
    }
    int* to_a(ll *head, int *len) {
    int *r = NULL;
    int i = 0;
    if(!head)
    return NULL;
    *len = ll_length(head);
    r = malloc(*len * sizeof(int));
    while(head) {
    r[i++] = head->val;
    head = head->nxt;
    }
    return r;
    }
    ll* ll_read(void) {
    ll *head = NULL;
    ll *cur = NULL;
    ll *tmp = NULL;
    int x;
    while(!feof(stdin)) {
    scanf("%d",&x);
    scanf(",");
    tmp = malloc(sizeof(ll));
    tmp->val = x;
    if(!head) {
    head = tmp;
    }
    if(cur) {
    cur->nxt = tmp;
    }
    cur = tmp;
    }
    return head;
    }
    int ll_length(ll *head) {
    int r = 0;
    while(head) {
    r++;
    head = head->nxt;
    }
    return r;
    }
    void ll_free(ll *head) {
    ll *nxt;
    while(head) {
    nxt = head->nxt;
    free(head);
    head = nxt;
    }
    }