RosettaCodeData/Task/Truncatable-primes/Phix/truncatable-primes.phix
2017-09-25 22:28:19 +02:00

38 lines
1.1 KiB
Text

constant N = 6, limit = power(10,N)
-- standard sieve:
enum L,R -- (with primes[i] as mini bit-field)
sequence primes = repeat(L+R, limit)
primes[1] = 0
for i=2 to floor(sqrt(limit)) do
if primes[i] then
for k=i*i to limit by i do
primes[k] = 0
end for
end if
end for
-- propagate non-truncateables up the prime table:
for p=1 to N-1 do
integer p10 = power(10,p) -- ie 10, 100, .. 100_000
for i=p10+1 to p10*10-1 by 2 do -- to 99, 999, .. 999_999
if primes[i] then
integer l = remainder(i,p10),
r = floor(i/10)
integer pi = and_bits(primes[l],L)+and_bits(primes[r],R)
if pi and find('0',sprint(i)) then pi = 0 end if
primes[i] = pi
end if
end for
end for
integer maxl=0, maxr=0
for i=limit-1 to 1 by -2 do
integer pi = primes[i]
if pi then
if maxl=0 and and_bits(pi,L) then maxl = i end if
if maxr=0 and and_bits(pi,R) then maxr = i end if
if maxl!=0 and maxr!=0 then exit end if
end if
end for
?{maxl,maxr}