local C = 0 local class_registry = {} local function class() C = C + 1 class_registry[C] = {} return C end local link = function(a,c,v,b) if not a[c] then a[c] = {} end if not b[-c] then b[-c] = {} end a[c][b] = v b[-c][a] = v end local classes = {} for character in ("abcdefghijklmnopqrstuvwxyz "):gmatch(".") do classes[character] = class() end classes.next = class() classes.inp = class() classes.out = class() local function l(a,c,v,b) end local function r(it) for class,link in pairs(it) do for to,value in pairs(link) do r(to) if class > 0 then l(it,class,value,to) else l(to,-class,value,it) end end end end while true do local input = io.read() local command,param = input:match("([^%s]+)(.*)") local function say(author,text) local previous for character in text:gmatch(".") do if classes[character] then local it = {} if previous then link(previous,classes.next,I,it) end link(it,classes.inp,I,{}) link(it,classes[character],I,{}) previous = it r(it) end end end (({ ["inp"] = function(text) say(classes.inp,text) end, ["out"] = function(text) say(classes.out,text) end, ["exit"] = function() os.exit() end })[command] or function(param) print("Unexpected command: '"..command.."' for '"..param.."''") end)(param) end