73 lines
1.5 KiB
Lua
73 lines
1.5 KiB
Lua
-- Define the constants
|
|
local p = 1.32471795724474602596
|
|
local s = 1.0453567932525329623
|
|
|
|
|
|
-- Generator for the Padovan sequence using coroutines
|
|
function pad_recur_gen(n)
|
|
local co = coroutine.create(function ()
|
|
local p = {1, 1, 1, 2}
|
|
for i = 1, n do
|
|
local next_val = p[2] + p[3]
|
|
coroutine.yield(p[1])
|
|
table.remove(p, 1)
|
|
table.insert(p, next_val)
|
|
end
|
|
end)
|
|
return function () -- iterator
|
|
local status, value = coroutine.resume(co)
|
|
return value
|
|
end
|
|
end
|
|
|
|
-- Padovan floor function
|
|
function pad_floor(index)
|
|
if index < 3 then
|
|
return math.floor(1/2 + p)
|
|
else
|
|
return math.floor(1/2 + p^(index - 2) / s)
|
|
end
|
|
end
|
|
|
|
local l, m, n = 10, 20, 32
|
|
|
|
local pr = {}
|
|
local pad_recur = pad_recur_gen(n)
|
|
for i = 1, n do
|
|
pr[i] = pad_recur()
|
|
end
|
|
for i = 1, m do
|
|
io.write(pr[i] .. ' ')
|
|
end
|
|
io.write('\n')
|
|
|
|
local pf = {}
|
|
for i = 1, n do
|
|
pf[i] = pad_floor(i)
|
|
end
|
|
for i = 1, m do
|
|
io.write(pf[i] .. ' ')
|
|
end
|
|
io.write('\n')
|
|
|
|
local L = {'A'}
|
|
local rules = { A = 'B', B = 'C', C = 'AB' }
|
|
for i = 1, n do
|
|
local next_str = ''
|
|
for char in L[#L]:gmatch('.') do
|
|
next_str = next_str .. rules[char]
|
|
end
|
|
table.insert(L, next_str)
|
|
end
|
|
for i = 1, l do
|
|
io.write(L[i] .. ' ')
|
|
end
|
|
io.write('\n')
|
|
|
|
for i = 1, n do
|
|
assert(pr[i] == pf[i] and pr[i] == #L[i],
|
|
"Uh oh, n=" .. i .. ": " .. pr[i] .. " vs " .. pf[i] .. " vs " .. #L[i])
|
|
end
|
|
|
|
print('100% agreement among all 3 methods.')
|