## to get into tthe correct directory cd("/cygdrive/c/Users/meurig/Documents/MyDocs150209/CS405/2011/Week1"); ## to make input and output readily visible %eden tcl("font configure edencode -size 20"); ## tcl("font configure edencode -size 10"); DFfont="{courier 36}"; ## default values of target and n must be supplied %scout string target; integer L, R; window teststr = { type: TEXT frame: ([{10,10}, 1, strlen(target)]) string: target bgcolor: "white" }; screen = ; window Lteststr, Rteststr; integer n; target = "BABBBAABBBAB"; ## cf. palindrome detector at http://ironphoenix.org/tril/tm/ n = 1; string segtarget, revsegtarget; Lteststr = { type: TEXT frame: ([{10,11+1.r}, 1, strlen(segtarget)]) string: segtarget bgcolor: "white" }; screen = ; Rteststr = { type: TEXT frame: ([{10+strlen(segtarget).c+1,11+1.r}, 1, strlen(revsegtarget)]) string: revsegtarget bgcolor: "yellow" }; %eden func reverse { para word; auto ix, result; result = ""; ix = word#; while (ix > 0) { result = result // str(word[ix]); ix--; } return result; } func prefix { para word, seglen; auto ix, result; result = ""; ix = 1; while (ix <= seglen) { result = result // str(word[ix]); ix++; } return result; } segtarget is prefix (target, n); revsegtarget is reverse(segtarget); ## above simple form works for even length palindromes: for odd length, use: revsegtarget is (2 * (target#/2) == target#) ? reverse(segtarget) : reverse(prefix(segtarget, segtarget#-1)); ## An alternative approach to model experiencing a palindrome ... /* %scout screen = ; %eden edenclocks = [[&tick, 100]]; instring = target; target is (tick == (tick/2 * 2)) ? instring : reverse(instring); %scout string bgcol; window teststr = { type: TEXT frame: ([{10, 10}, 1, strlen(target)]) string: target bgcolor: bgcol }; %eden bgcol is (tick == (tick/2 * 2)) ? "white" : "yellow"; */