RosettaCodeData/Task/Prime-triangle/Julia/prime-triangle-2.julia
2023-07-01 13:44:08 -04:00

32 lines
1.1 KiB
Text

using Primes
function solverow(row, pos, avail)
results, nresults = Int[], 0
for (i, tf) in enumerate(avail)
if tf && isprime(row[pos - 1] + i + 1)
if pos >= length(row) - 1 && isprime(row[end] + i + 1)
row[pos] = i + 1
return (copy(row), 1)
else
row[pos] = i + 1
newav = copy(avail)
newav[i] = false
newresults, n = solverow(copy(row), pos + 1, newav)
nresults += n
results = isempty(results) && !isempty(newresults) ? newresults : results
end
end
end
return results, nresults
end
function primetriangle(nrows::Integer)
nrows < 2 && error("number of rows requested must be > 1")
counts, rowstrings = [1; zeros(Int, nrows - 1)], ["" for _ in 1:nrows]
for r in 2:nrows
p, n = solverow(collect(1:r+1), 2, trues(r - 1))
rowstrings[r] = prod([lpad(n, 3) for n in p]) * "\n"
counts[r] = n
end
println(" 1 2\n" * prod(rowstrings), "\n", counts)
end