Prime triangle: Difference between revisions
Content added Content deleted
(Created Nim solution.) |
|||
Line 1,163: | Line 1,163: | ||
{1, 1, 1, 1, 1, 2, 4, 7, 24, 80, 216, 648, 1304, 3392, 13808, 59448, 155464, 480728, 1588162}</pre> |
{1, 1, 1, 1, 1, 2, 4, 7, 24, 80, 216, 648, 1304, 3392, 13808, 59448, 155464, 480728, 1588162}</pre> |
||
=={{header|Nim}}== |
|||
{{trans|C}} |
|||
<syntaxhighlight lang="Nim">import std/[monotimes, strutils, times] |
|||
const IsPrime = [false, false, true, true, false, true, false, true, |
|||
false, false, false, true, false, true, false, false, |
|||
false, true, false, true, false, false, false, true, |
|||
false, false, false, false, false, true, false, true, |
|||
false, false, false, false, false, true, false, false, |
|||
false, true, false, true, false, false, false, true, |
|||
false, false, false, false, false, true, false, false, |
|||
false, false, false, true, false, true, false, false] |
|||
type TriangleRow = openArray[Natural] |
|||
template isPrime(n: Natural): bool = IsPrime[n] |
|||
func primeTriangleRow(a: var TriangleRow): bool = |
|||
if a.len == 2: |
|||
return isPrime(a[0] + a[1]) |
|||
for i in countup(1, a.len - 2, 2): |
|||
if isPrime(a[0] + a[i]): |
|||
swap a[i], a[1] |
|||
if primeTriangleRow(a.toOpenArray(1, a.high)): |
|||
return true |
|||
swap a[i], a[1] |
|||
func primeTriangleCount(a: var TriangleRow): Natural = |
|||
if a.len == 2: |
|||
if isPrime(a[0] + a[1]): |
|||
inc result |
|||
else: |
|||
for i in countup(1, a.len - 2, 2): |
|||
if isPrime(a[0] + a[i]): |
|||
swap a[i], a[1] |
|||
inc result, primeTriangleCount(a.toOpenArray(1, a.high)) |
|||
swap a[i], a[1] |
|||
proc print(a: TriangleRow) = |
|||
if a.len == 0: return |
|||
for i, n in a: |
|||
if n > 0: stdout.write ' ' |
|||
stdout.write align($n, 2) |
|||
stdout.write '\n' |
|||
let start = getMonoTime() |
|||
for n in 2..20: |
|||
var a = newSeq[Natural](n) |
|||
for i in 0..<n: |
|||
a[i] = i + 1 |
|||
if a.primeTriangleRow: |
|||
print a |
|||
echo() |
|||
for n in 2..20: |
|||
var a = newSeq[Natural](n) |
|||
for i in 0..<n: |
|||
a[i] = i + 1 |
|||
if n > 2: stdout.write " " |
|||
stdout.write a.primeTriangleCount |
|||
echo '\n' |
|||
echo "Elapsed time: ", (getMonoTime() - start).inMilliseconds, " ms" |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> 1 2 |
|||
1 2 3 |
|||
1 2 3 4 |
|||
1 4 3 2 5 |
|||
1 4 3 2 5 6 |
|||
1 4 3 2 5 6 7 |
|||
1 2 3 4 7 6 5 8 |
|||
1 2 3 4 7 6 5 8 9 |
|||
1 2 3 4 7 6 5 8 9 10 |
|||
1 2 3 4 7 10 9 8 5 6 11 |
|||
1 2 3 4 7 10 9 8 5 6 11 12 |
|||
1 2 3 4 7 6 5 12 11 8 9 10 13 |
|||
1 2 3 4 7 6 13 10 9 8 11 12 5 14 |
|||
1 2 3 4 7 6 13 10 9 8 11 12 5 14 15 |
|||
1 2 3 4 7 6 5 12 11 8 15 14 9 10 13 16 |
|||
1 2 3 4 7 6 5 12 11 8 9 10 13 16 15 14 17 |
|||
1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 12 11 18 |
|||
1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 12 11 18 19 |
|||
1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 12 19 18 11 20 |
|||
1 1 1 1 1 2 4 7 24 80 216 648 1304 3392 13808 59448 155464 480728 1588162 |
|||
Elapsed time: 535 ms |
|||
</pre> |
|||
=={{header|Pascal}}== |
=={{header|Pascal}}== |