primechain.frink

// Program to find the largest number that is made up of the concatenation of
// unique n-digit prime numbers.
// For example, for 2-digit primes, the sequence 31, 11, 17, 79 becomes
// the number 31179.

start = now[]

digits = eval[input["Enter length of chain: ", 3]]

// Find limits of range
smallest = 1

for i = 1 to digits-1
smallest = smallest * 10 + 1

largest = smallest * 9

leading = new dict

n = smallest
// Find prime numbers in this range
while n <= largest
{
if isPrime[n]
{
ns = "\$n"
lead = substringLen[ns, 0, digits-1]

else
}

n = nextPrime[n]
}

orderSort = { |a,b| a@0 <=> b@0 }

sortedList = new array

stack = new array

greatest = 0

for [num, list] reverse[sort[leading, orderSort]]
{
c = 0
for c = 0 to length[list]-1
{
list@c@1 = true           // Mark used
n = list@c@0
greatest = test[n, digits, stack, leading, greatest]
list@c@1 = false
}
}

// Recursive function to test numbers.
test[n, digits, stack, leading, greatest] :=
{
stack.push[n]
if (length[stack] > greatest)
{
greatest = length[stack]
println["\$stack\t(\$greatest)"]
}

n = substringLen[n, 1, digits-1]

for i = 0 to length[leading@n]-1
{
if leading@n@i@1 == false
{
leading@n@i@1 = true        // Mark used
greatest = test[leading@n@i@0, digits, stack, leading, greatest]