RosettaCodeData/Task/De-Bruijn-sequences/Pluto/de-bruijn-sequences.pluto
2026-04-30 12:34:36 -04:00

59 lines
1.7 KiB
Text

require "table2"
local fmt = require "fmt"
local deBruijn = ""
for n = 0, 99 do
local a = fmt.lpad(n, 2, "0")
local a1 = a[1]:byte()
local a2 = a[2]:byte()
if a2 >= a1 then
deBruijn ..= (a1 == a2) ? string.char(a1) : a
local m = n + 1
while m <= 99 do
local ms = fmt.lpad(m, 2, "0")
if ms[2]:byte() > a1 then deBruijn ..= a .. ms end
m += 1
end
end
end
deBruijn ..= "000"
print($"de Bruijn sequence length: {#deBruijn}\n")
print($"First 130 characters:\n{deBruijn:sub(1, 130)}\n")
print($"Last 130 characters:\n{deBruijn:sub(-130, -1)}\n")
local function check(text)
local res = {}
local found = table.rep(10000, 0)
local k = 0
for i = 1, #text - 3 do
local s = text:sub(i, i + 3)
if s:split(""):checkall(|c| -> "0" <= c <= "9") then
k = tonumber(s)
found[k + 1] += 1
end
end
for i = 1, 10000 do
k = found[i]
if k != 1 then
local e = $" Pin number {fmt.lpad(i - 1, 4, "0")} "
e ..= (k == 0) ? "missing" : $"occurs {k} times"
res:insert(e)
end
end
k = #res
if k == 0 then
res = "No errors found"
else
local s = (k == 1) ? "" : "s"
res = $"{k} error{s} found:\n" .. res:concat("\n")
end
return res
end
print($"Missing 4 digit PINs in this sequence: {check(deBruijn)}")
print($"Missing 4 digit PINs in the reversed sequence: {check(deBruijn:reverse())}")
print($"\n4,444th digit in the sequence: '{deBruijn[4444]}' (setting it to '.')")
deBruijn = deBruijn:sub(1, 4443) .. "." .. deBruijn:sub(4445)
print($"Re-running checks: {check(deBruijn)}")