Prime triangle: Difference between revisions

→‎{{header|Visual Basic .NET}}: Slight Simplification
(→‎{{header|ALGOL 68}}: Slight simplification)
(→‎{{header|Visual Basic .NET}}: Slight Simplification)
Line 1,120:
Public Const maxNumber As Integer = 20 ' Largest number we will consider.
Dim prime(2 * maxNumber) As Boolean ' prime sieve.
Dim primePair(maxNumber, maxNumber) As Boolean ' Table of numbers that sum to a prime.
 
''' <returns>The next number that can follow i or 0 if there isn't one.</returns>
Public Function findNext(ByVal i As Integer, ByVal n As Integer, ByVal current As Integer, ByVal used() As Boolean) As Integer
Dim result As Integer = current + 2
' The numbers must alternate between even and odd in order for the sum to be prime.
If i Mod 2 = 0 And result = 2 Then
result = 3
End If
Do While result < n AndAlso (Not primePair(i, result) Or used(result))
result += 2
Loop
If result >= n Then
result = 0
End If
Return result
End Function
 
''' <returns>The number of possible arrangements of the integers for a row in the prime triangle.</returns>
Public Function countArrangements(ByVal n As Integer, ByVal printSolution As Boolean ) As Integer
If n < 2 Then ' No solutions for n < 2.
Return 0
ElseIf n < 4 Then
' For 2 and 3. there is only 1 solution: 1, 2 and 1, 2, 3.
IfFor printSolutioni ThenAs Integer = 1 To n
For Console.Out.Write(i As Integer = 1 To n.ToString.PadLeft(3))
Next Console.Out.Write(i.ToString.PadLeft(3))
Next iConsole.Out.WriteLine()
Console.Out.WriteLine()
End If
Return 1
Else
' 4 or more - must find the solutions.
Dim printSolution As Boolean = true
Dim used(n) As Boolean
Dim number(n) As Integer
' The triangle row must have 1 in the leftmost and n in the rightmost elements.
' The numbers must alternate between even and odd in order for the sumsums to be prime.
number(1) = 1
For bi As Integer = 20 To maxNumbern - 1
number(1i) = 1i Mod 2
resultNext = 3i
used(1) = True
number(n) = n
Line 1,163 ⟶ 1,148:
Dim count As Integer = 0
Dim p As Integer = 2
Do While p <> n0
Dim pnp1 As Integer = number(p - 1)
Dim [next]current As Integer = findNext(pn, n, number(p), used)
Dim result Dim [next] As Integer = current + 2
Do While result[next] < n AndAlso (Not primePairprime(i,p1 + result[next]) Or used(result[next]))
result [next] += 2
Loop
If i Mod 2 = 0 And result If [next] >= 2n Then
result [next] = 0
End If
If p = n - 1 Then
' We are at the final number before n.
Do' WhileIt must If([next]be =the 0,final False,even/odd Notnumber primePair([next],preceded n))by the final odd/even number.
If [next] =<> findNext(pn, n, [next],0 used)Then
Loop ' Possible solution.
numberIf prime(p)[next] =+ n) 0Then
' Found a solution.
Console.Out.WriteLine() count += 1
If count = 1 AndIf printSolution Then
For i As Integer = 1 To n - 2
Console.Out.Write(number(i).ToString.PadLeft(3))
Next i
Console.Out.WriteLine([next].ToString.PadLeft(3) & n.ToString.PadLeft(3))
used(number(p)) printSolution = False
End If
End If
p[next] += 10
End If
' Backtrack for more solutions.
p -= 1
' There will be a further backtrack as next is 0 ( there could only be one possible number at p - 1 ).
End If
If [next] <> 0 Then
' have a/another number that can appear at p.
used(number(p)current) = False
used([next]) = True
number(p) = [next]
If' pHaven't <found nall -the 1intervening Thendigits yet.
p += ' Haven't found all the intervening digits yet.1
p += 1
number(p) = 0
Else
' Found a solution.
count += 1
If count = 1 And printSolution Then
For i As Integer = 1 To n
Console.Out.Write(number(i).ToString.PadLeft(3))
Next i
Console.Out.WriteLine()
End If
' Backtrack for more solutions.
used(number(p)) = False
number(p) = 0
p -= 1
End If
ElseIf p <= 2 Then
' No more solutions.
p = n0
Else
' Can't find a number for this position, backtrack.
used(number(p)) = False
number(p) = 0p Mod 2
p -= 1
End If
Line 1,221 ⟶ 1,213:
End If
Next i
For a As Integer = 1 To maxNumber
primePair(a, 1) = False
For b As Integer = 2 To maxNumber
primePair(a, b) = prime(a + b)
Next b
primePair(a, a) = False
Next a
 
Dim arrangements(maxNumber) As Integer
For n As Integer = 2 To UBound(arrangements)
arrangements(n) = countArrangements(n, True)
Next n
For n As Integer = 2 To UBound(arrangements)
3,044

edits