\d .s A:(_ci 97+!26;_ci 48+!10) set:{:[~_n~p:pfx[x;y;z 1];cmd[x;y;p,(0,s?" ")_ s:1_ z 1];_n~r::[_n~*z;.:;*z]z 1;0;r]} pfx:{.[x;`K;:;y];.[x;`W;:;:[~_n~r:typ z," ";();y]];r} typ:{:["="=s:*x;`C;s _in"BCDEFG";`$s]} cmd:{:[`C=*z;exp[x;y;1_ z];att[x;y;z]];x .`T,y} att:{:[""~z 1;dc1[x;y;z 0 2];dcn[x;y;(*z;z[1;0]_in*|A;1_ z)]]} dcn:{dc1[x;;(z[0];z[2;1])]'rep[x;y;(z 1;z[2;0])]} dc1:{.[x;z[0],y;:;.*|z];.[x;`V;,;,y]} rep:{:[*z;row[x;y;.*|z];col[x;y;`$*|z]]} row:{(*y),/:rid[*|y;*z]} col:{cid[x;*y;*z],\:*|y} rid:{(x&y)+!1+__abs y-x} cid:{c rid .(c:x`C)?/:y,z} exp:{:[""~*z;df1[x;y;*|z];dfn[x;y;(z[0;0]_in*|A;z)]]} dfn:{(df1[x]. sub[z 0;z[1;1]]@)'rep[x;y;(*z;z[1;0])]} sub:{(z;(#t)_,/(t:$z x){x,1_ y}/:(&s="$")_ s:"$",y)} df1:{:[""~z;clr[x;y;x .`Z,y];prs[x;y;z]];.[x;`V;,;,y]} clr:{(`X`Y`Z,\:y).[x;;:;]'(;;());{.[x;`ZZ,z;_dv;y]}[;y]/[x;z]} prs:{(`X`Y,\:y).[x;;:;]'(z;one[x;y;two[x;y;z]])} two:{:[1=#s:(&":"=s)_ s:":",z;z;,/rng[x;y]'(&~(!#s)!2)_1_'s]} rng:{all[x;y](||:'end[|*z;*A];end[z 1;*|A])} end:{{((0,(y _lin x)?1)_ y),,z}[y].(0,1+(&\~<':x _lin y)?0)_ x} all:{z[0;0],".s.get[_d;",(axp[gen[x;y;z]]. z),"]",z[1;2]} axp:{"(`",:[x;y[1],";",y[2]," ",z[1];y[1],"`",z[0],";",y[2]],")"} gen:{(dep[x;y]prc@)'(ctc[x];rtr)[r:z[0;1]~z[1;0]]. z;r} prc:{(0,(x _lin*|A)?1)_ x} rtr:{(*y),/:$rid[.*|x;. y 1]} ctc:{($cid[x].`$(y 1;*z)),\:z 1} one:{,/spl[x;y]'(&1>':z _lin"._`\"",*A)_ z} spl:{:[~(*z)_in*A;z;,/@[(0,(z _lin,/A)?0)_ z;0;nam[x;y]]]} nam:{:[""~*|r:prc z;vec[x;y;*r];".s.get[_d;",(5:dep[x;y;r]),"]"]} vec:{vxp[x;dep[x;y]'(z{(x;y)}/:$!x`N)_dv$y;z]} vxp:{:[(#y)=x`N;".s.get[_d;`",z,"]";"(.s.get[_d]'",(5:y),")"]} dep:{cyc[x;y;r:(`;0)$z];.[x;`Z,y;,;,r];.[x;`ZZ,r;,;,y];r} cyc:{if[y _in(,z),don[x;x .`Z,z];'"cycle!"]} don:{:[()~y;y;y,,/x _f/:x[`Z]./:y]} act:{:[y~_n;x`C;y]{(,y,z)inv[x]/:x .`ZZ,y,z}[x]\:/::[z~_n;!x`N;z];x get/:x`V} inv:{if[~z _in y,x`V;.[x;`V;,;,z];_f[x;y,,z]'x .`ZZ,z]} get:{:[@y;x gat/:y,/:!x`N;&/@:'y;gat[x;y];x gat/:gxy[x]. y]} gxy:{:[~@y;(cid[x]. y),\:z;~@z;y,/:rid . z;(y;z)]} gat:{:[~y _in _dv/x'`V`W;x .`T,y;dat[x;y;:[(~x`J)|@r:x .`Y,y;x .`T,y;. r]]]} dat:{.[x;`T,y;:;z];if[x`J;.[x;`V;_dv;y]];z} fd0:{,(`N_;!x;.+(`e`f`l;(0;-8$;"")))} fds:{(y;x#0;.+(`k`e`f`g`fg`bg;(k;`.s.e;`.s.f;`.s.g;`.s.fg;`.s.bg)))} f:{:[~_n~r:ap[x;`D];r;0~x;8#"";(4:x)_in 1 2 3 4 -3;$x;5:x]} g:{set[dr _d;cl[_v;_i];(dr[_d][`G]. cl[_v;_i];x)]} k:".[.s.dr _d;`K;:;.s.cl[_v;_i]];" e:{:[~_n~r:ap[x;`E];r;~-3=4:x]} fg:{c:cl[_v;_i];d:dr _d;:[~_n~r:ap[x;`F];r;@d .`X,c;0;((c _in d`V)&~d`J)|c~d`W;990000;99]} bg:{c:cl[_v;_i];d:dr _d;:[~_n~r:ap[x;`B];r;0~d .`E,c;808080]} ap:{:[7=4:f:dr[_d]. y,cl[_v;_i];f x;~_n~f;f]} cl:{(`$1_*|(&"."=v)_ v:$x;*y)} dr:{`$(- 1+(|v)?".")_ v:$x} \d .S C:`$/:*.s.A N:100 J..d:"N;C;1";J..c:`check;J..t:"if[._v;_d .s.get/:V]";J..l:"Calculate" I..d:":[@X . K;5:T . K;\"=\",X . K]";I..t:".[`T;K;:;.s.set[_d;K;(_d[`G]. K;._v)]];";I..l:">" K..d:"N;(*C;0)" Q..d:"(,/$:'K),,/\" \",/:\"DFBG\",'\"=\",/:$:'`D`F`B`G .\\:K";Q..e:0;Q..l:"<" T..d:"..s.fd0[N],N .s.fds/:C";T..t:".s.act[_d]. 2#_i,_n;";T..l:"" X..d:Y..d:D..d:F..d:B..d:E..d:G..d:".+(C;(#C)#,N#_n)" Z..d:ZZ..d:".+(C;(#C)#,N#,())" V..d:W..d:"C;N;()" \d ~ a:`J`Q`I`T x:95 y:30