-- $Id: wordfreq.lua,v 1.1.1.1 2004-05-19 18:14:18 bfulgham Exp $ -- http://www.bagley.org/~doug/shootout/ -- implemented by: Roberto Ierusalimschy -- this version reads input line by line and so it is -- noticably slower than the version that reads the -- input in blocks. local read = io.read local gsub,strlower,format = string.gsub,string.lower,string.format local tinsert,sort = table.insert,table.sort local words = {} -- list of all words (for sorting) local count = {} -- count occurrences of each word while 1 do local line = read() if line == nil then break end gsub(strlower(line), "(%l+)", function (w) local cw = count[w] if cw == nil then -- first occurrence? cw = 0 tinsert(words, w) end count[w] = cw + 1 end) end sort(words, function (a,b) return count[a] > count[b] or (count[a] == count[b] and a > b) end) for i=1,#words do local w = words[i] io.write(format("%7d\t%s\n", count[w], w)) end