From afec5a7e05a9960b1f60be44a77fda8f771c9504 Mon Sep 17 00:00:00 2001 From: Tyler Wardhaugh Date: Sat, 10 Oct 2020 22:58:01 -0700 Subject: Ch81 [Lua]: Tasks 1 & 2 I used LPeg for both of these solutions, which is surely overkill. But I wanted to experiment with it. --- challenge-081/tyler-wardhaugh/lua/ch-2.lua | 73 ++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100755 challenge-081/tyler-wardhaugh/lua/ch-2.lua (limited to 'challenge-081/tyler-wardhaugh/lua/ch-2.lua') diff --git a/challenge-081/tyler-wardhaugh/lua/ch-2.lua b/challenge-081/tyler-wardhaugh/lua/ch-2.lua new file mode 100755 index 0000000000..49b5732fb1 --- /dev/null +++ b/challenge-081/tyler-wardhaugh/lua/ch-2.lua @@ -0,0 +1,73 @@ +#!/usr/bin/env lua + +--[[ + An iterator over a table yielding keys (and their corresponding values) in + sorted order. + + source: ideas from "keysToList" (and others) in: + http://lua-users.org/wiki/SortedIteration +]]-- +function ordered_pairs(tbl, cmp) + local o = {} + for k, _ in pairs(tbl) do table.insert(o, k) end + table.sort(o, cmp) + + local i = 0 + return function() + i = i + 1 + return o[i], tbl[o[i]] + end +end + +local t2 = {} + +do + local lpeg = require'lpeg' + lpeg.locale(lpeg) + local C, Cs, Ct, P, S = lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.P, lpeg.S + + local strip = (S[[."(),]] + P"'s" + P"--" + P"\n") + t2.sanitizer = Cs((strip / " " + 1)^0) + + local space = lpeg.space^1 + local word = C((1 - space)^1) + t2.wordify = Ct(word * (space * word)^0) +end + +function t2.frequency_sort(text) + local sanitized = t2.sanitizer:match(text) + local words = t2.wordify:match(sanitized) + + local count = {} + for _, v in ipairs(words) do count[v] = (count[v] or 0) + 1 end + + local invert = {} + for k, v in pairs(count) do + if invert[v] then + table.insert(invert[v], k) + else + invert[v] = {k} + end + end + + for _, v in pairs(invert) do table.sort(v) end + + return invert +end + +function t2.slurp(input) + local fh = assert(io.open(input, "r")) + local text = fh:read("*all") + fh:close() + return text +end + +function t2.run(args) + local input = args[1] + local results = t2.frequency_sort(t2.slurp(input)) + for k, v in ordered_pairs(results) do + print(k, table.concat(v, " "), "\n") + end +end + +return t2 -- cgit