curses = require "curses" count = {} function foo(event, line) local s = debug.getinfo(2) --? print(s.name) if s.name ~= nil then if count[s.name] == nil then count[s.name] = 0 end count[s.name] = count[s.name]+1 end end debug.sethook(foo, "c") window = curses.initscr() tower = {{6, 5, 4, 3, 2}, {}, {}} function len(array) local result = 0 for k in pairs(array) do result = result+1 end return result end function pop(array) return table.remove(array) end function lines(window) local lines, cols = window:getmaxyx() return lines end function cols(window) local lines, cols = window:getmaxyx() return cols end function render_disk(window, line, col, size) col = col-size+1 for i=1,size do window:attron(curses.color_pair(size)) window:mvaddstr(line, col, " ") window:attroff(curses.color_pair(size)) col = col+2 end end function render_tower(window, line, col, tower_index, tower) window:attron(curses.A_BOLD) window:mvaddch(line+2, col, string.char(96+tower_index)) window:attroff(curses.A_BOLD) window:attron(curses.color_pair(7)) window:mvaddstr(line+1, col-6, " ") window:attroff(curses.color_pair(7)) for i, n in ipairs(tower) do render_disk(window, line, col, n) line = line - 1 end for i=1,5-len(tower)+1 do window:attron(curses.color_pair(7)) window:mvaddstr(line, col, " ") window:attroff(curses.color_pair(7)) line = line - 1 end window:mvaddstr(30, 0, "profile: ") for k,v in pairs(count) do window:addstr(k) window:addstr(": ") window:addstr(v) window:addstr("; ") end end function render(window) window:clear() local lines, cols = window:getmaxyx() local line = math.floor(lines/2) local col = math.floor(cols/4) for i,t in ipairs(tower) do render_tower(window, line, i*col, i, t) end curses.refresh() end function make_move(from, to) local disk = pop(tower[from]) table.insert(tower[to], disk) end function update(window) window:mvaddstr(lines(window)-2, 5, "tower to remove top disk from? ") local from = string.byte(curses.getch()) - 96 window:mvaddstr(lines(window)-1, 5, "tower to stack it on? ") local to = string.byte(curses.getch()) - 96 make_move(from, to) end function main() curses.start_color() curses.use_default_colors() for i=1,7 do curses.init_pair(i, 0, i) end while true do render(window) update(window) end curses.endwin() end main()