// k life [path to pattern directory] / compute next generation tables:{b:+/(8#2)_vs k:!_2^8;(k@&b=2;k@&b=3)} L:tables[] next:{[u;v;s]a:index[u]. s;w:(?,/a)_dvl u;b:index[w]. s;v:@[v;u;:;1];lookup[,/L;u;v a],lookup[L 1;w;v b]} index:{(x+/:(1;-1;z;-z;z+1;z-1;-z+1;-z-1))!y*z} lookup:{[t;i;b]i@&(2 _sv b)_lin t} / next:{[u;v;s]a:index[u]. s;w:(?,/a)_dvl u;b:index[w]. s;v:@[v;u;:;1];(u@&(2=k)|3=k:+/v a),w@&3=+/v b} / graphics vbox:{(,/(7 2#,!0){x,,y}/:(0 0 1 1 0;0 1 1 0 0)+/:+y _vs x),,,:'2#|/y} / .lif files in directory lif:{{x@&".lif"~/:((_ci@[!256;65+!26;+;32])@_ic$-4#)'x}@!x} / load .lif file load:{K:::["#C"~2#*t:0:P,"/",x;load2 t;load1 t],,x::[#x;x;*F]} / alan hensel's .lif format load1:{d:(i:&"#P"~/:2#'x)_ x;A::{(1+(2#x)_in("#D";"#N"))_ x}'i[0]#x;vec[1++norm .+(. 2_*:)'d;(max"*"=1_)'d]} vec:{s:|/x+^:'y;(s;s _sv@[s _vs ,/(s _sv+x)+{&,/x,\:&s[1]-*|^x}'y;1;s[1]-])} max:{+x,'&:'(|/c)-c:#:'x} norm:{(x-&/x;y-&/y)} / run-length-encoded format load2:{i:&~"#"=*:'x;A::2_'x _di i;s:xy x i 0;(|s;or[s;pat[s 1;(rle@|1_)'(&t="$")_ t:{(x?"!")#x}"$",,/x 1_ i]])} xy:{t:1_'(&x=",")_ x:",",x;t:t _dv'" ";{0$x@&x _lin"0123456789"}'t[t[;0]?/:"yx"]} rle:{&|,/{{(.|y)#x="o"}. 0 1_:[1=#x;x,"1";x]}'(&x _lin"ob")_ x:@[x;&~x _lin"ob0123456789";:;"o"]} pat:{,/y+0+\(-1+#y)#x} or:{(|x)_sv|@[x _vs y;0;x[0]-]} / timer time:{."\\t ",$x} auto:{if[Auto;`k . Next]} .t..t:".k.auto[]" / shape, universe, zero-vector, generation-counter S..d:"K[0]+2*Pad" U..d:"S _sv Pad+K[0]_vs K 1" V..d:"&*/S" G..d:"S;0" / gui Pad:0 Time:.001 Time..f:6.3$ Time..t:"time Time" Next:"U:next[U;V;S];G+:1" Next..c:`button Auto:0 Auto..c:`check P::[#_i;*_i;"patterns"] F:lif P F..k:"load _v ._i" F..e:0 F..l:P F..x:30 A:() A..e:0 A..l:` A..x:80 A..y:20 D..d:"vbox[U;S]" D..c:`plot D..x:70 D..y:35 D..l..d:".k.K 2" \d ~ c:`form a:,(`F;(`Pad`Time`Auto`Next;`A)) l..d:"$.k.G" y:22 \d ~ time Time load"" `show$`.k; `show$`.k.D;