/* ex1-c: Advent2020 game, day 8/game 1 */ #include #include #include struct list { unsigned size; unsigned last; unsigned long long *list; }; #define DEFNSUM 25 #define BLOCKSIZE 1024 /* number of elements for realloc() */ void print_list(list) struct list *list; { unsigned i, psize=list->last; unsigned long long *ptr=list->list; fprintf(stderr, "PROGRAM: address=%p pinstr=%p size=%d\n", list, ptr, psize); for (i=0; ilist=malloc(sizeof(unsigned long long)*BLOCKSIZE); list->size=BLOCKSIZE; list->last=0; } cur=list->last; size=list->size; if (cur == size) { size+=BLOCKSIZE; list->size=size; list->list=realloc(list->list, sizeof(unsigned long long)*size); fprintf(stderr, "realloc buf: cur=%d size=%d ptr=%p\n", cur, size, list->list); } ptr=list->list+cur; sscanf(line, "%d", &val); *ptr=val; list->last++; return list; } unsigned long long badnum(list, cur, nsum) struct list *list; int cur; unsigned nsum; { unsigned long long *ptr=list->list; unsigned long long res=*(ptr+cur); int start=cur-nsum, i, j; for (i=start; ilast; unsigned long long *ptr=list->list, cur; unsigned long long min=*(ptr+start), max=min; for (i=start; i max) max=cur; if (sum == target) { return min+max; } } return 0; } int main(ac, av) int ac; char **av; { unsigned nsum=DEFNSUM; char line[80]; struct list *list=NULL; unsigned i; unsigned long long res1, res2; if (ac==2) { nsum=atoi(*(av+1)); } while (fgets(line, sizeof line, stdin)) { list=add_line(list, line); } //print_list(list); for (i=nsum; ilast; ++i) { if (res1=badnum(list, i, nsum)) { //printf("%s : res=%llu\n", *av, res1); break; } } for (i=0; ilast; ++i) { if (res2=findsum(list, res1, i)) { printf("%s : res=%llu sum=%llu\n", *av, res1, res2); break; } } exit (0); }