72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
var canFollow [][]bool
|
|
var arrang []int
|
|
var bFirst = true
|
|
|
|
var pmap = make(map[int]bool)
|
|
|
|
func init() {
|
|
for _, i := range []int{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37} {
|
|
pmap[i] = true
|
|
}
|
|
}
|
|
|
|
func ptrs(res, n, done int) int {
|
|
ad := arrang[done-1]
|
|
if n-done <= 1 {
|
|
if canFollow[ad-1][n-1] {
|
|
if bFirst {
|
|
for _, e := range arrang {
|
|
fmt.Printf("%2d ", e)
|
|
}
|
|
fmt.Println()
|
|
bFirst = false
|
|
}
|
|
res++
|
|
}
|
|
} else {
|
|
done++
|
|
for i := done - 1; i <= n-2; i += 2 {
|
|
ai := arrang[i]
|
|
if canFollow[ad-1][ai-1] {
|
|
arrang[i], arrang[done-1] = arrang[done-1], arrang[i]
|
|
res = ptrs(res, n, done)
|
|
arrang[i], arrang[done-1] = arrang[done-1], arrang[i]
|
|
}
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
func primeTriangle(n int) int {
|
|
canFollow = make([][]bool, n)
|
|
for i := 0; i < n; i++ {
|
|
canFollow[i] = make([]bool, n)
|
|
for j := 0; j < n; j++ {
|
|
_, ok := pmap[i+j+2]
|
|
canFollow[i][j] = ok
|
|
}
|
|
}
|
|
bFirst = true
|
|
arrang = make([]int, n)
|
|
for i := 0; i < n; i++ {
|
|
arrang[i] = i + 1
|
|
}
|
|
return ptrs(0, n, 1)
|
|
}
|
|
|
|
func main() {
|
|
counts := make([]int, 19)
|
|
for i := 2; i <= 20; i++ {
|
|
counts[i-2] = primeTriangle(i)
|
|
}
|
|
fmt.Println()
|
|
for i := 0; i < 19; i++ {
|
|
fmt.Printf("%d ", counts[i])
|
|
}
|
|
fmt.Println()
|
|
}
|