day 18 : C part 2 + retrofit for part 1
This commit is contained in:
16
OUTPUT
16
OUTPUT
@@ -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
|
||||||
|
@@ -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
|
||||||
|
16
day18/OUTPUT
16
day18/OUTPUT
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
117
day18/ex1-c.c
117
day18/ex1-c.c
@@ -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
203
day18/ex12-c.c
Normal 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);
|
||||||
|
}
|
Reference in New Issue
Block a user