54 lines
1.4 KiB
Lua
54 lines
1.4 KiB
Lua
-- Return the next term in the self-referential sequence
|
|
function findNext (nStr)
|
|
local nTab, outStr, pos, count = {}, "", 1, 1
|
|
for i = 1, #nStr do nTab[i] = nStr:sub(i, i) end
|
|
table.sort(nTab, function (a, b) return a > b end)
|
|
while pos <= #nTab do
|
|
if nTab[pos] == nTab[pos + 1] then
|
|
count = count + 1
|
|
else
|
|
outStr = outStr .. count .. nTab[pos]
|
|
count = 1
|
|
end
|
|
pos = pos + 1
|
|
end
|
|
return outStr
|
|
end
|
|
|
|
-- Return boolean indicating whether table t contains string s
|
|
function contains (t, s)
|
|
for k, v in pairs(t) do
|
|
if v == s then return true end
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- Return the sequence generated by the given seed term
|
|
function buildSeq (term)
|
|
local sequence = {}
|
|
repeat
|
|
table.insert(sequence, term)
|
|
if not nextTerm[term] then nextTerm[term] = findNext(term) end
|
|
term = nextTerm[term]
|
|
until contains(sequence, term)
|
|
return sequence
|
|
end
|
|
|
|
-- Main procedure
|
|
nextTerm = {}
|
|
local highest, seq, hiSeq = 0
|
|
for i = 1, 10^6 do
|
|
seq = buildSeq(tostring(i))
|
|
if #seq > highest then
|
|
highest = #seq
|
|
hiSeq = {seq}
|
|
elseif #seq == highest then
|
|
table.insert(hiSeq, seq)
|
|
end
|
|
end
|
|
io.write("Seed values: ")
|
|
for _, v in pairs(hiSeq) do io.write(v[1] .. " ") end
|
|
print("\n\nIterations: " .. highest)
|
|
print("\nSample sequence:")
|
|
for _, v in pairs(hiSeq[1]) do print(v) end
|