Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 36 additions & 30 deletions j.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,57 +4,63 @@ J WS=0;

J*ma(J n){n=n*8,WS+=n;R(J*)malloc(n);}_ mv(J*d,J*s,J n){N(n,d[i]=s[i]);}
J tr(J r,J*d){J z=1;N(r,z=z*d[i]);R z;}K i(C c,S s){J i=0;C r;W(r=s[i++])P(r==c,(K)i)R 0;}
K ga(J t,J r,J*d){K z=(K)ma(5+tr(r,d));zt=t,zr=r,mv(zd,d,r);R z;}K1(id){R x;}
K ga(J t,J r,J*d){K z=(K)ma(6+tr(r,d));zt=t,zr=r,mv(zd,d,r);R z;}K1(id){R x;}
K1(ri){R xc++,x;}K1(rd){R xc--,x;}
K1(r0){Z(!x,R(K)0)Z(!xc,WS-=8*(6+tr(xr,xd));free(x);R(K)0)R x;}
K2(x0){R r0(x),rd(y);}K3(xy0){r0(x);r0(y);R rd(z);}

K1(iota){J n=*xp;K z=ga(0,1,&n);N(n,zp[i]=i)R z;}
K2(plus){J r=yr,*d=yd,n=tr(r,d);K z=ga(0,r,d);
N(n,zp[i]=xp[i]+yp[i])R z;}
K2(mul){J r=yr,*d=yd,n=tr(r,d);K z=ga(0,r,d);
N(n,zp[i]=xp[i]*yp[i])R z;}
K1(iota){J n=*xp;K z=ri(ga(0,1,&n));N(n,zp[i]=i)R x0(x,z);}
K2(plus){J r=yr,*d=yd,n=tr(r,d);K z=ri(!xc?x:!yc?y:ga(0,r,d));
N(n,zp[i]=xp[i]+yp[i])R xy0(x,y,z);}
K2(mul){J r=yr,*d=yd,n=tr(r,d);K z=ri(!xc?x:!yc?y:ga(0,r,d));
N(n,zp[i]=xp[i]*yp[i])R xy0(x,y,z);}
K2(from){J r=yr-1,*d=yd+1,n=tr(r,d);
K z=ga(yt,r,d);mv(zp,yp+(n**xp),n);R z;}
K1(box){K z=ga(1,0,0);*zp=(J)x;R z;}
K z=ri(ga(yt,r,d));mv(zp,yp+(n**xp),n);R xy0(x,y,z);}
K1(box){K z=ga(1,0,0);ri(x);*zp=(J)x;R z;}
K2(cat){J an=tr(xr,xd),wn=tr(yr,yd),n=an+wn;
K z=ga(yt,1,&n);mv(zp,xp,an);mv(zp+an,yp,wn);R z;}
K z=ri(ga(yt,1,&n));mv(zp,xp,an);mv(zp+an,yp,wn);R xy0(x,y,z);}
K2(find){R O("nyi\n"),(K)0;}
K2(rsh){J r=xn,n=tr(r,xp),wn=tr(yr,yd);
K z=ga(yt,r,xp);mv(zp,yp,wn=n>wn?wn:n);
if(n-=wn)mv(zp+wn,zp,n);R z;}
K1(sha){K z=ga(0,1,&xr);mv(zp,xd,xr);R z;}
K1(size){K z=ga(0,0,0);*zp=xn;R z;}
K1(fst){K z=ga(0,0,0);*zp=*xp;R z;}
K1(rev){J r=xr,*d=xd,n=tr(r,d);K z=ga(0,r,d);
N(n,zp[i]=xp[n-i-1])R z;}

C vt[]="+{!<#,*|",at[]="\\/";
K(*vd[])(K,K)={0,plus,from,find,0, rsh,cat,mul,0},
(*vm[])(K )={0,id, size,iota,box,sha,0 ,fst,rev},
K z=ri(ga(yt,r,xp));mv(zp,yp,wn=n>wn?wn:n);
if(n-=wn)mv(zp+wn,zp,n);R xy0(x,y,z);}
K1(sha){K z=ri(ga(0,1,&xr));mv(zp,xd,xr);R x0(x,z);}
K1(size){K z=ri(ga(0,0,0));*zp=xn;R x0(x,z);}
K1(fst){K z=ri(ga(0,0,0));*zp=*xp;R x0(x,z);}
K1(rev){J r=xr,*d=xd,n=tr(r,d),i=0;K z=ri(ga(0,r,d));
N(n,zp[i]=xp[n-i-1])R x0(x,z);}
K1(flip){R O("nyi\n"),(K)0;}

C vt[]=":+{!<#,*|",at[]="\\/";
K(*vd[])(K,K)={0,set,plus,from,find,0, rsh,cat,mul,0},
(*vm[])(K )={0,id, flip,size,iota,box,sha,0 ,fst,rev},
(*va[])(K,K)={0,scan,over};

K2(over){P(Ay,y)K z=ga(0,0,0);J r=0;N(yn,r+=yp[i]);R*zp=r,z;}
K2(scan){P(Ay,y)K z=ga(0,yr,yd);J r=0;N(yn,zp[i]=(r+=yp[i]))R z;}
K2(set){J a=(J)x;Z(qp(a),x=st[a-'a'];r0(x?rd(x):x);R ri(st[a-'a']=y))Z(qv(a),R (*vm[a])(y));R y;}


J sI(S a,J*n){C c;J i=0,r=*n=0;
W((c=*a++)&&(c>='0'&&c<='9'))i++,r=r*10u+((J)c-'0');R*n=i,r;}
_ pi(J i){O("%lld ",i);}_ nl(){O("\n");}_ pt(){O(" ");}
_ pr(K x){J r=xr,*d=xd,n=tr(r,d);
Z(xt,N(n,O("< ");pr((K)xp[i])))N(n,pi(xp[i]));}
C qp(J a){R a>='a'&&a<='z';}C qv(J a){R a<'a';}
Z(xt,N(n,O("< ");pr((K)xp[i])))N(n,pi(xp[i]));r0(x);}
C qp(J a){R a>='a'&&a<='z';}C qv(J a){R a<VTSZ;}C qa(J a){R (a>VTSZ)&&(a<=VTSZ+ATSZ);}
K adv(C c){R i(c,at);}K verb(C c){R i(c,vt);}
K noun(S*a){K z;J l;C c=**a;P(c<'0'||c>'9',(K)0);
z=ga(0,0,0);*zp=sI(*a,&l);*a+=l-1;R z;}

K ex(K*e){J a=(J)*e,b=(J)e[1];C o;
Z(qp(a),P(':'==b,st[a-'a']=ex(e+2))a=(J)st[a-'a']);
P(qv(a)&&adv(b),(*va[(J)adv(b)])((K)a,ex(e+2)))
Z(qp(a)&&set==*vd[b],R set((K)a,ex(e+2)))Z(qp(a),a=(J)st[a-'a']);
P(qv(a)&&qa(b),(*va[b-VTSZ])((K)a,ex(e+2)))
R qv(a)?(*vm[a])(ex(e+1)):b?(*vd[b])((K)a,ex(e+2)):(K)a;}

K*wd(S s){K a,*e;C c;J n=strlen(s);
P(!n,(K*)0);s[--n]=0;e=(K*)ma(n+1);n=0;
W(c=*s){e[n++]=(a=noun(&s))?a:(a=verb(c))?a:((K)(J)c);s++;}
R e[n]=0,e;}
K*wd(S s,J*n){K a,*e;C c;*n=strlen(s);
P(!n,(K*)0);s[(*n)-1]=0;e=(K*)ma(*n);J i=0;
W(c=*s){e[i++]=(a=noun(&s))?a:(a=adv(c))?(K)(VTSZ+(J)a):(a=verb(c))?a:((K)(J)c);s++;}
R e[i]=0,e;}

int main(){C s[99];W(//O("WS: %llu\n",WS),
pt(),fgets(s,99,stdin))pr(ex(wd(s))),nl();R 0;}
int main(){C s[99];K *e;J n;W(//O("WS: %llu\n",WS),
pt(),fgets(s,99,stdin))pr(ex(e=wd(s,&n))),nl(),free(e),WS-=8*n;R 0;}

//:~
12 changes: 10 additions & 2 deletions j.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
#include<stdio.h> //fgets printf
#include<string.h> //strlen

typedef void _;typedef char C,*S;typedef long long J;typedef struct a{J t,r;J d[3];J p[2];}*K;static K st[26];
typedef void _;typedef char C,*S;typedef long long J;typedef struct a{J c,t,r;J d[3];J p[2];}*K;static K st[26];


#define O printf
#define R return
Expand All @@ -14,17 +15,21 @@ typedef void _;typedef char C,*S;typedef long long J;typedef struct a{J t,r;J d[

#define K1(f) K f(K x)
#define K2(f) K f(K x,K y)
#define K3(f) K f(K x,K y,K z)

#define xc x->c
#define xt x->t
#define xr x->r
#define xd x->d
#define xp x->p

#define yc y->c
#define yt y->t
#define yr y->r
#define yd y->d
#define yp y->p

#define zc z->c
#define zt z->t
#define zr z->r
#define zd z->d
Expand All @@ -36,6 +41,9 @@ typedef void _;typedef char C,*S;typedef long long J;typedef struct a{J t,r;J d[
#define Ay (!yr)
#define yn (yr?*yd:1)

K2(over);K2(scan);K ex(K*e);
#define VTSZ 8LL //!< size of verb table
#define ATSZ 3LL //!< size of advb table

K2(over);K2(scan);K ex(K*e);K2(set);C qp(J a);C qv(J a);

//:~