90 lines
2.3 KiB
Lua
90 lines
2.3 KiB
Lua
-- Import http namespace from socket library
|
|
http = require("socket.http")
|
|
|
|
-- Download the page at url and return as string
|
|
function getFromWeb (url)
|
|
local body, statusCode, headers, statusText = http.request(url)
|
|
if statusCode == 200 then
|
|
return body
|
|
else
|
|
error(statusText)
|
|
end
|
|
end
|
|
|
|
-- Return a boolean to show whether word is a hexword
|
|
function isHexWord (word)
|
|
local hexLetters, ch = "abcdef"
|
|
for pos = 1, #word do
|
|
ch = word:sub(pos, pos)
|
|
if not string.find(hexLetters, ch) then return false end
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- Return the sum of the digits in num
|
|
function sumDigits (num)
|
|
local sum, nStr, digit = 0, tostring(num)
|
|
for pos = 1, #nStr do
|
|
digit = tonumber(nStr:sub(pos, pos))
|
|
sum = sum + digit
|
|
end
|
|
return sum
|
|
end
|
|
|
|
-- Return the digital root of x
|
|
function digitalRoot (x)
|
|
while x > 9 do
|
|
x = sumDigits(x)
|
|
end
|
|
return x
|
|
end
|
|
|
|
-- Return a table from built from the lines of the string dct
|
|
-- Each table entry contains the digital root, word and base 10 conversion
|
|
function buildTable (dct)
|
|
local t, base10 = {}
|
|
for line in dct:gmatch("[^\n]+") do
|
|
if # line > 3 and isHexWord(line) then
|
|
base10 = (tonumber(line, 16))
|
|
table.insert(t, {digitalRoot(base10), line, base10})
|
|
end
|
|
end
|
|
table.sort(t, function (a,b) return a[1] < b[1] end)
|
|
return t
|
|
end
|
|
|
|
-- Return a boolean to show whether str has at least 4 distinct characters
|
|
function fourDistinct (str)
|
|
local distinct, ch = ""
|
|
for pos = 1, #str do
|
|
ch = str:sub(pos, pos)
|
|
if not string.match(distinct, ch) then
|
|
distinct = distinct .. ch
|
|
end
|
|
end
|
|
return #distinct > 3
|
|
end
|
|
|
|
-- Unpack each entry in t and print to the screen
|
|
function showTable (t)
|
|
print("\n\nRoot\tWord\tBase 10")
|
|
print("====\t====\t=======")
|
|
for i, v in ipairs(t) do
|
|
print(unpack(v))
|
|
end
|
|
print("\nTable length: " .. #t)
|
|
end
|
|
|
|
-- Main procedure
|
|
local dict = getFromWeb("http://wiki.puzzlers.org/pub/wordlists/unixdict.txt")
|
|
local hexWords = buildTable(dict)
|
|
showTable(hexWords)
|
|
local hexWords2 = {}
|
|
for k, v in pairs(hexWords) do
|
|
if fourDistinct(v[2]) then
|
|
table.insert(hexWords2, v)
|
|
end
|
|
end
|
|
table.sort(hexWords2, function (a, b) return a[3] > b[3] end)
|
|
showTable(hexWords2)
|