59 lines
1.7 KiB
Text
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)}")
|