50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
from numpy import array
|
|
# for Rosetta Code by MG - 20230312
|
|
def is_prime(n: int) -> bool:
|
|
assert n < 64
|
|
return ((1 << n) & 0x28208a20a08a28ac) != 0
|
|
|
|
def prime_triangle_row(a: array, start: int, length: int) -> bool:
|
|
if length == 2:
|
|
return is_prime(a[0] + a[1])
|
|
for i in range(1, length - 1, 1):
|
|
if is_prime(a[start] + a[start + i]):
|
|
a[start + i], a[start + 1] = a[start + 1], a[start + i]
|
|
if prime_triangle_row(a, start + 1, length - 1):
|
|
return True
|
|
a[start + i], a[start + 1] = a[start + 1], a[start + i]
|
|
return False
|
|
|
|
def prime_triangle_count(a: array, start: int, length: int) -> int:
|
|
count: int = 0
|
|
if length == 2:
|
|
if is_prime(a[start] + a[start + 1]):
|
|
count += 1
|
|
else:
|
|
for i in range(1, length - 1, 1):
|
|
if is_prime(a[start] + a[start + i]):
|
|
a[start + i], a[start + 1] = a[start + 1], a[start + i]
|
|
count += prime_triangle_count(a, start + 1, length - 1)
|
|
a[start + i], a[start + 1] = a[start + 1], a[start + i]
|
|
return count
|
|
|
|
def print_row(a: array):
|
|
if a == []:
|
|
return
|
|
print("%2d"% a[0], end=" ")
|
|
for x in a[1:]:
|
|
print("%2d"% x, end=" ")
|
|
print()
|
|
|
|
for n in range(2, 21):
|
|
tr: array = [_ for _ in range(1, n + 1)]
|
|
if prime_triangle_row(tr, 0, n):
|
|
print_row(tr)
|
|
print()
|
|
for n in range(2, 21):
|
|
tr: array = [_ for _ in range(1, n + 1)]
|
|
if n > 2:
|
|
print(" ", end="")
|
|
print(prime_triangle_count(tr, 0, n), end="")
|
|
print()
|