2020 day 25 (C): just copied my (lazy/brute-force) bash solution
This commit is contained in:
@@ -490,10 +490,12 @@ ex2.bash: res=32760
|
||||
================= day23 =================
|
||||
=========================================
|
||||
|
||||
+++++++++++++++++ ex1
|
||||
ex1.bash: res=75893264
|
||||
time: 0:00.01 real, 0.01 user, 0.00 sys
|
||||
context-switch: 0+1, page-faults: 0+166
|
||||
|
||||
+++++++++++++++++ ex2
|
||||
ex2.bash: res=38162588308
|
||||
time: 6:52.50 real, 412.30 user, 0.14 sys
|
||||
context-switch: 2219+1, page-faults: 0+30233
|
||||
@@ -502,10 +504,12 @@ ex2.bash: res=38162588308
|
||||
================= day24 =================
|
||||
=========================================
|
||||
|
||||
+++++++++++++++++ ex1
|
||||
ex1.bash: res=450
|
||||
time: 0:00.17 real, 0.17 user, 0.00 sys
|
||||
context-switch: 5+1, page-faults: 0+177
|
||||
|
||||
+++++++++++++++++ ex2
|
||||
ex2.bash: res=4059
|
||||
time: 0:22.35 real, 22.22 user, 0.07 sys
|
||||
context-switch: 1471+1, page-faults: 0+858
|
||||
@@ -514,6 +518,11 @@ ex2.bash: res=4059
|
||||
================= day25 =================
|
||||
=========================================
|
||||
|
||||
+++++++++++++++++ ex1
|
||||
ex1.bash: res=9620012
|
||||
time: 2:42.30 real, 162.05 user, 0.08 sys
|
||||
context-switch: 3634+1, page-faults: 0+163
|
||||
|
||||
ex1-c : res=9620012
|
||||
time: 0:00.08 real, 0.08 user, 0.00 sys
|
||||
context-switch: 2+1, page-faults: 0+79
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* ex1-c: Advent2020 game, day 18/tasks 1 & 2
|
||||
/* ex1-c: Advent2020 game, day 19/tasks 1 & 2
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -6,168 +6,11 @@
|
||||
#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;
|
||||
}
|
||||
struct rule {
|
||||
struct rule *left;
|
||||
struct rule *right;
|
||||
|
||||
};
|
||||
int main(ac, av)
|
||||
int ac;
|
||||
char **av;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
INPUT := INPUT.txt
|
||||
SHELL := /bin/bash
|
||||
CFLAGS := -w -g
|
||||
CFLAGS := -w -g -O3
|
||||
#CFLAGS := -w -g -pg
|
||||
#CFLAGS := -w -O3
|
||||
TIME := \time -f "\ttime: %E real, %U user, %S sys\n\tcontext-switch:\t%c+%w, page-faults: %F+%R\n"
|
||||
@@ -13,15 +13,15 @@ all: ex1
|
||||
output:
|
||||
@$(MAKE) --no-print-directory all 2>&1 > OUTPUT
|
||||
|
||||
compile: ex1-c ex2-c
|
||||
compile: ex1-c
|
||||
|
||||
ex1:
|
||||
ex1: ex1-c
|
||||
@$(TIME) ex1.bash < $(INPUT) 2>&1
|
||||
@#$(TIME) ex1-c 2020 < $(INPUT) 2>&1
|
||||
@$(TIME) ex1-c < $(INPUT) 2>&1
|
||||
|
||||
ex2:
|
||||
@$(TIME) ex2.bash < $(INPUT) 2>&1
|
||||
@#$(TIME) ex1-c 30000000 < $(INPUT) 2>&1
|
||||
@#$(TIME) ex2.bash < $(INPUT) 2>&1
|
||||
@#$(TIME) ex1-c < $(INPUT) 2>&1
|
||||
|
||||
clean:
|
||||
@rm -f ex1-c ex2-c core
|
||||
|
Reference in New Issue
Block a user