#! /usr/bin/gawk -f # Last edited on 2013-01-05 04:50:31 by stolfilocal BEGIN { split("",tb); ntb = 0; # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 st(tb, "... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. **. **. *o. *o. **. **. *o. *o. "); # 0 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... "); # st(tb, ".** .** .o* .o* .** .** .o* .o* *** *** *o* *o* *** *** *o* *o* "); # 1 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "*.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. **. **. *o. *o. **. **. *o. *o. "); # 2 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "*.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. *.. "); # st(tb, ".** .** .** .** .** .** .** .** *** *** *o* *o* *** *** *o* *o* "); # 3 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. *o. *o. *o. *o. **. **. *o. *o. "); # 4 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. .*. "); # st(tb, ".o* .** .o* .o* .o* .** .o* .o* *o* *o* *?* *?* *o* *o* *?* *?* "); # 5 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "**. **. **. **. **. **. **. **. **. **. **. **. **. **. **. **. "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. *o. *o. *o. *o. **. **. *o. *o. "); # 6 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "**. **. **. **. **. **. **. **. **. **. **. **. **. **. **. **. "); # st(tb, ".o* .** .o* .o* .o* .** .o* .o* *o* *o* *?* *?* *o* *o* *?* *?* "); # 7 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. **. **. **. **. **. **. **. **. "); # 8 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* ..* "); # st(tb, ".** .** .o* .o* .** .** .o* .o* *** *** *o* *o* *** *** *o* *o* "); # 9 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "*.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. **. **. **. **. **. **. **. **. "); # 10 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "*.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* *.* "); # st(tb, ".** .** .** .** .** .** .** .** *** *** *o* *o* *** *** *o* *o* "); # 11 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, ".** .** .** .** .** .** .** .** .** .** .** .** .** .** .** .** "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. *o. *o. *o. *o. **. **. *o. *o. "); # 12 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, ".** .** .** .** .** .** .** .** .** .** .** .** .** .** .** .** "); # st(tb, ".o* .** .o* .o* .o* .** .o* .o* *o* *o* *?* *?* *o* *o* *?* *?* "); # 13 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** "); # st(tb, ".*. .*. .*. .*. .*. .*. .*. .*. *o. *o. *o. *o. **. **. *o. *o. "); # 14 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # st(tb, "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** "); # st(tb, ".o* .** .o* .o* .o* .** .o* .o* *o* *o* *?* *?* *o* *o* *?* *?* "); # 15 st(tb, "... *.. .*. **. ..* *.* .** *** ... *.. .*. **. ..* *.* .** *** "); # st(tb, " "); # if (ntb != 64) { bug("row mismatch", 0, ntb, ""); } split("", pattern); split("", action); for (code = 0; code < 256; code++) { action[code] = ""; } for (x = 0; x < 16; x++) { for (y = 0; y < 16; y++) { pat = pack_neighbors(tb, x, y, +1, +1, 0); code = encode_neighbors(tb, x, y, +1, +1, 0); act = get_action(tb, x, y); if (action[code] != "") { bug("dup pattern", x, y, ""); } pattern[code] = pat; action[code] = act; for (dx = -1; dx <= +1; dx += 2) { for (dy = -1; dy <= +1; dy += 2) { for (swap = 0; swap <= 1; swap++) { codex = encode_neighbors(tb, x, y, dx, dy, swap); patx = pattern[codex]; actx = action[codex]; if ((actx != "") && (actx != act)) { bug_inc("inconsistent action", x, y, pat, act, patx, actx); } } } } } } for (code = 0; code < 256; code++) { printf "%03d %02x %s\n", code, code, action[code]; } } function st(tb,s, i) { if (length(s) != 64) { bug("bad string",ntb,0,s); } for(i = 0; i < 64; i++) { tb[ntb,i] = substr(s,i+1,1); } ntb++; } function encode_neighbors(tb,x,y,dx,dy,swap, tx,ty,rx,ry,v,b,code) { code = 0; for (ty = -1; ty <= +1; ty++) { for (tx = -1; tx <= +1; tx++) { if ((tx != 0) || (ty != 0)) { if (swap) { rx = 4*x + ty*dy + 1; ry = 4*y + tx*dx + 1; } else { rx = 4*x + tx*dx + 1; ry = 4*y + ty*dy + 1; } v = tb[ry,rx]; if (v == ".") { b = 0; } else if (v == "*") { b = 1; } else { bug("bad char", rx, ry, v); } code = 2*code + b; } } } return code; } function pack_neighbors(tb,x,y, tx,ty,rx,ry,v,pat) { pat = ""; for (ty = -1; ty <= +1; ty++) { for (tx = -1; tx <= +1; tx++) { if ((tx != 0) || (ty != 0)) { rx = 4*x + tx + 1; ry = 4*y + ty + 1; v = tb[ry,rx]; if (v == ".") { b = 0; } else if (v == "*") { b = 1; } else { bug("bad char", rx, ry, v); } pat = (pat v); } } } return pat; } function get_action(tb,x,y, rx,ry,v) { rx = 4*x + 1; ry = 4*y + 1; v = tb[ry,rx]; if ((v != "*") && (v != "o") && (v != "?")) { bug("bad action", rx, ry, v); } return v; } function bug(msg,x,y,s) { printf "** %s %d %d [%s]\n", msg, x, y, s > "/dev/stderr"; exit 1; } function bug_inc(msg,x,y,pat1,act1,pat2,act2, k,tx,ty,i1,i2,v) { printf "** %s %d %d\n", msg, x, y > "/dev/stderr"; i1 = 1; i2 = 1; for (ty = -1; ty <= +1; ty++) { for (k = 0; k <= 1; k++) { for (tx = -1; tx <= +1; tx++) { if ((tx != 0) || (ty != 0)) { if (k == 0) { v = substr(pat1,i1,1); i1++; } else { v = substr(pat2,i2,1); i2++; } } else { if (k == 0) { v = act1; } else { v = act2; } } printf "%s", v > "/dev/stderr"; } printf " " > "/dev/stderr"; } printf "\n" > "/dev/stderr"; } exit 1; }