From 2f8f6001f6c7c7e8c96d6c5c6b50d20f9ddf1083 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Tue, 20 Jul 2021 18:21:08 +0200 Subject: [PATCH] day 18 : C part 2 + retrofit for part 1 --- OUTPUT | 16 ++-- day18/Makefile | 8 +- day18/OUTPUT | 16 ++-- day18/TEST.txt | 4 + day18/ex1-c.c | 117 ---------------------------- day18/ex12-c.c | 203 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 231 insertions(+), 133 deletions(-) delete mode 100644 day18/ex1-c.c create mode 100644 day18/ex12-c.c diff --git a/OUTPUT b/OUTPUT index 5bbbb55..f9e0ba8 100644 --- a/OUTPUT +++ b/OUTPUT @@ -414,14 +414,18 @@ ex2-c : res=1680 +++++++++++++++++ ex1 ex1.bash : res=650217205854 - time: 0:01.71 real, 1.70 user, 0.00 sys - context-switch: 39+1, page-faults: 0+191 + time: 0:01.80 real, 1.78 user, 0.01 sys + context-switch: 28+1, page-faults: 0+190 -ex1-c : res=650217205854 +ex12-c : res=650217205854 time: 0:00.00 real, 0.00 user, 0.00 sys - context-switch: 0+1, page-faults: 0+73 + context-switch: 0+1, page-faults: 0+75 +++++++++++++++++ ex2 ex2.bash : res=20394514442037 - time: 0:01.54 real, 1.53 user, 0.01 sys - context-switch: 42+1, page-faults: 0+196 + time: 0:01.56 real, 1.55 user, 0.01 sys + context-switch: 16+1, page-faults: 0+196 + +ex12-c : res=20394514442037 + time: 0:00.00 real, 0.00 user, 0.00 sys + context-switch: 0+1, page-faults: 0+74 diff --git a/day18/Makefile b/day18/Makefile index 8689c77..d50bea6 100644 --- a/day18/Makefile +++ b/day18/Makefile @@ -15,13 +15,13 @@ output: compile: ex1-c ex2-c -ex1: ex1-c +ex1: ex12-c @$(TIME) ex1.bash < $(INPUT) 2>&1 - @$(TIME) ex1-c 2020 < $(INPUT) 2>&1 + @$(TIME) ex12-c 1 < $(INPUT) 2>&1 -ex2: +ex2: ex12-c @$(TIME) ex2.bash < $(INPUT) 2>&1 - @#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1 + @$(TIME) ex12-c 2 < $(INPUT) 2>&1 clean: @rm -f ex1-c ex2-c core diff --git a/day18/OUTPUT b/day18/OUTPUT index 74e98a7..b5b657c 100644 --- a/day18/OUTPUT +++ b/day18/OUTPUT @@ -1,12 +1,16 @@ ex1.bash : res=650217205854 - time: 0:01.71 real, 1.70 user, 0.00 sys - context-switch: 39+1, page-faults: 0+191 + time: 0:01.80 real, 1.78 user, 0.01 sys + context-switch: 28+1, page-faults: 0+190 -ex1-c : res=650217205854 +ex12-c : res=650217205854 time: 0:00.00 real, 0.00 user, 0.00 sys - context-switch: 0+1, page-faults: 0+73 + context-switch: 0+1, page-faults: 0+75 ex2.bash : res=20394514442037 - time: 0:01.61 real, 1.55 user, 0.00 sys - context-switch: 4+2, page-faults: 0+195 + time: 0:01.56 real, 1.55 user, 0.01 sys + context-switch: 16+1, page-faults: 0+196 + +ex12-c : res=20394514442037 + time: 0:00.00 real, 0.00 user, 0.00 sys + context-switch: 0+1, page-faults: 0+74 diff --git a/day18/TEST.txt b/day18/TEST.txt index 29b7b33..6e33178 100644 --- a/day18/TEST.txt +++ b/day18/TEST.txt @@ -1,2 +1,6 @@ 1 + 2 * 3 + 4 * 5 + 6 1 + (2 * 3) + (4 * (5 + 6)) +2 * 3 + (4 * 5) +5 + (8 * 3 + 9 + 3 * 4 * 3) +5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4)) +((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2 diff --git a/day18/ex1-c.c b/day18/ex1-c.c deleted file mode 100644 index 87fffe7..0000000 --- a/day18/ex1-c.c +++ /dev/null @@ -1,117 +0,0 @@ -/* ex1-c: Advent2020 game, day 18/task 1 - */ - -#include -#include -#include - -#define T_SUB (-1) -#define T_END (-2) -#define T_PLUS (-4) -#define T_MULT (-8) -#define T_ERR (-16) - -#define DIGIT(c) (((c) >= '0') && ((c) <= '9')) - -static long eval_expr(); - -static char *saveptr=NULL; -static long get_tok() -{ - char *p, c; - long val=0; - - p=saveptr; - while (!val) { - c=*p; - switch (c) { - case ' ': - break; - case '(': - val=T_SUB; - p++; - saveptr=p; - return eval_expr(); - break; - case ')': - case '\n': - case '\0': - val=T_END; - break; - case '*': - val=T_MULT; - break; - case '+': - val=T_PLUS; - break; - default: - if (! DIGIT(c)) { - val=T_ERR; - break; - } - while (DIGIT(c)) { - val=(val*10 + c - '0'); - p++; - c=*p; - } - p--; - break; - } - p++; - } - saveptr=p; - return val; -} - -static long eval_expr() -{ - long res=T_SUB, op=T_ERR; - long left=0; - - res=get_tok(); - left=res; - while (res!=T_ERR && res!=T_END) { - switch (res) { - case T_END: - goto end; - break; - case T_PLUS: - case T_MULT: - op=res; - break; - case T_ERR: - left=res; - goto end; - break; - default: - switch (op) { - case T_PLUS: - left+=res; - break; - case T_MULT: - left*=res; - break; - } - break; - } - res=get_tok(); - } -end: - return left; -} - -int main(ac, av) - int ac; - char **av; -{ - char line[1024]; - long res=0, tmp; - - while (fgets(line, sizeof line, stdin)) { - saveptr=line; - tmp=eval_expr(); - res+=tmp; - } - printf("%s : res=%ld\n", *av, res); - exit (0); -} diff --git a/day18/ex12-c.c b/day18/ex12-c.c new file mode 100644 index 0000000..a852599 --- /dev/null +++ b/day18/ex12-c.c @@ -0,0 +1,203 @@ +/* ex1-c: Advent2020 game, day 18/tasks 1 & 2 + */ + +#include +#include +#include +#include + +#define T_LPAR (-'(') +#define T_RPAR (-')') + +#define T_PLUS (-'+') +#define T_MULT (-'*') + +#define T_ERR (-'E') +#define T_OK (-'O') +#define T_END (-'$') + +#define LEN_MAX 1024 + +#define NPUSH(n) (push(&nstack, (n))) +#define OPUSH(o) (push(&ostack, (o))) + +#define NPOP() (pop(&nstack)) +#define OPOP() (pop(&ostack)) + +#define NTOP() (top(&nstack)) +#define OTOP() (top(&ostack)) + +#define OEMPTY() (empty(&ostack)) + +#define DIGIT(c) (((c) >= '0') && ((c) <= '9')) + +static struct stack { + int last; + long elt[LEN_MAX]; +} nstack, ostack; + +static char *saveptr=NULL; + +static int prio_1(long op) +{ + return op==T_PLUS || op==T_MULT? 1: 0; +} +static int prio_2(long op) +{ + return op==T_PLUS? 2: op==T_MULT? 1: 0; +} +static int (*prio)()=&prio_1; + +static long push(struct stack *s, long val) +{ + s->elt[s->last++]=val; + return val; +} +static long pop(struct stack *s) +{ + return s->elt[--s->last]; +} +static long top(struct stack *s) +{ + return s->elt[s->last-1]; +} +static long empty(struct stack *s) +{ + return s->last==0; +} + +static void print() { + int i; + printf("NSTACK: "); + for (i=0; i= (*prio)(res)) + eval_top(); + OPUSH(res); + break; + + default: + NPUSH(res); + break; + } + res=get_tok(); + //print(); + } + while(!OEMPTY()) + eval_top(); + + // return NSTACK's top + //printf("Returning %ld\n", NTOP()); + return NPOP(); +//end: +// return left; +} + +int main(ac, av) + int ac; + char **av; +{ + char line[1024]; + long res=0, tmp; + + if (ac != 2) { + fprintf(stderr, "usage: %s [1|2]\n", *av); + exit (1); + } + if (**(av+1) == '2') + prio=&prio_2; + + while (fgets(line, sizeof line, stdin)) { + //gets(line, sizeof line, stdin); + //NPUSH(10); + //NPUSH(100); + //NPUSH(1000); + //print(); + //printf("TOP=%ld\n", NTOP()); + //NPOP(); + //print(); + + saveptr=line; + //printf("%s", line); + tmp=eval_expr(); + //printf("%s : res=%ld\n", line, tmp); + res+=tmp; + } + printf("%s : res=%ld\n", *av, res); + exit (0); +}