RosettaCodeData/Task/Ormiston-triples/Pluto/ormiston-triples.pluto
2026-04-30 12:34:36 -04:00

39 lines
1.1 KiB
Text

local int = require "int"
local fmt = require "fmt"
local limit <const> = 1e10
local primes = int.primes(limit, true)
local orm25 = {}
local j = limit / 10
local count = 0
local counts = {}
for i = 1, #primes - 2 do
local p1 = primes[i]
local p2 = primes[i + 1]
local p3 = primes[i + 2]
if (p2 - p1) % 18 != 0 or (p3 - p2) % 18 != 0 then continue end
local key1 = 1
for int.digits(p1) as dig do key1 *= primes[dig + 1] end
local key2 = 1
for int.digits(p2) as dig do key2 *= primes[dig + 1] end
if key1 != key2 then continue end
local key3 = 1
for int.digits(p3) as dig do key3 *= primes[dig + 1] end
if key2 == key3 then
if count < 25 then orm25:insert(p1) end
if p1 >= j then
counts:insert(count)
j *= 10
end
count += 1
end
end
counts:insert(count)
print("Smallest members of first 25 Ormiston triples:")
fmt.tprint("%10s ", orm25:mapped(|e| -> fmt.int(e)), 5)
print()
j = limit / 10
for i = 1, #counts do
fmt.print("%s Ormiston triples before %s", fmt.int(counts[i]), fmt.int(j))
j *= 10
end