day 18 : C part 2 + retrofit for part 1

This commit is contained in:
2021-07-20 18:21:08 +02:00
parent 0501335642
commit 2f8f6001f6
6 changed files with 231 additions and 133 deletions

16
OUTPUT
View File

@@ -414,14 +414,18 @@ ex2-c : res=1680
+++++++++++++++++ ex1 +++++++++++++++++ ex1
ex1.bash : res=650217205854 ex1.bash : res=650217205854
time: 0:01.71 real, 1.70 user, 0.00 sys time: 0:01.80 real, 1.78 user, 0.01 sys
context-switch: 39+1, page-faults: 0+191 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 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
ex2.bash : res=20394514442037 ex2.bash : res=20394514442037
time: 0:01.54 real, 1.53 user, 0.01 sys time: 0:01.56 real, 1.55 user, 0.01 sys
context-switch: 42+1, page-faults: 0+196 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

View File

@@ -15,13 +15,13 @@ output:
compile: ex1-c ex2-c compile: ex1-c ex2-c
ex1: ex1-c ex1: ex12-c
@$(TIME) ex1.bash < $(INPUT) 2>&1 @$(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) ex2.bash < $(INPUT) 2>&1
@#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1 @$(TIME) ex12-c 2 < $(INPUT) 2>&1
clean: clean:
@rm -f ex1-c ex2-c core @rm -f ex1-c ex2-c core

View File

@@ -1,12 +1,16 @@
ex1.bash : res=650217205854 ex1.bash : res=650217205854
time: 0:01.71 real, 1.70 user, 0.00 sys time: 0:01.80 real, 1.78 user, 0.01 sys
context-switch: 39+1, page-faults: 0+191 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 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 ex2.bash : res=20394514442037
time: 0:01.61 real, 1.55 user, 0.00 sys time: 0:01.56 real, 1.55 user, 0.01 sys
context-switch: 4+2, page-faults: 0+195 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

View File

@@ -1,2 +1,6 @@
1 + 2 * 3 + 4 * 5 + 6 1 + 2 * 3 + 4 * 5 + 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

View File

@@ -1,117 +0,0 @@
/* ex1-c: Advent2020 game, day 18/task 1
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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);
}

203
day18/ex12-c.c Normal file
View File

@@ -0,0 +1,203 @@
/* ex1-c: Advent2020 game, day 18/tasks 1 & 2
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#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<nstack.last; ++i) {
printf("%ld ", nstack.elt[i]);
}
printf("\nOSTACK: ");
for (i=0; i<ostack.last; ++i) {
printf("%c ", (char) -ostack.elt[i]);
}
printf("\n");
}
static long get_tok()
{
char *p, c;
long val=0;
p=saveptr;
while (!val) {
c=*p;
switch (c) {
case ' ':
break;
case '(':
case ')':
case '*':
case '+':
val=-c;
break;
case '\n':
case '\0':
val=T_END;
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_top()
{
long val2 = NPOP();
long val1 = NPOP();
char op = OPOP();
NPUSH(op==T_PLUS? val1+val2: val1*val2);
return NTOP();
}
static long eval_expr()
{
long res=T_LPAR;
res=get_tok();
while (res!=T_ERR && res!=T_END) {
switch (res) {
case T_LPAR:
OPUSH(res);
break;
case T_RPAR:
while(!OEMPTY() && OTOP() != T_LPAR)
eval_top();
if(!OEMPTY()) // remove '('
OPOP();
break;
case T_PLUS:
case T_MULT:
while (!OEMPTY() && (*prio)(OTOP()) >= (*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);
}