In freebasic Bonus 1 is implemented
Function AddRange(Puzzle() As Byte, StartPos As Integer,Direction As Integer) As Integer
Dim As Integer Sum, i
For i = 0 To Sqr(UBound(Puzzle)) - 1
Sum += Puzzle(StartPos + i * Direction)
Next
Return Sum
End Function
Function IsMagicSquare(Puzzle() As Byte) As Boolean
Dim As Integer PuzzleSize = UBound(Puzzle)
Dim As Integer SquareSize = Sqr(PuzzleSize)
Dim As Integer Sum,i
'// Get sum of first Row, Use that value to compare all others lines To
Sum = AddRange(Puzzle(),1,1)
'// Check Rows
For i = 1 To PuzzleSize Step SquareSize
If AddRange(Puzzle(),i,1) <> Sum Then Return 0
Next
'// Check Columns
For i = 1 To SquareSize
If AddRange(Puzzle(),i,SquareSize) <> Sum Then Return 0
Next
'// Check Topleft to BottomRight
If AddRange(Puzzle(),1,SquareSize + 1) <> Sum Then Return 0
'// Check TopRight to BottomLeft
If AddRange(Puzzle(),SquareSize,SquareSize - 1) <> Sum Then Return 0
Return 1
End Function
'// 3x3 Squares
Dim Puzzle_1(1 To 9) As Byte = {8, 1, 6, 3, 5, 7, 4, 9, 2} : Print IsMagicSquare(Puzzle_1()) '// True
Dim Puzzle_2(1 To 9) As Byte = {2, 7, 6, 9, 5, 1, 4, 3, 8} : Print IsMagicSquare(Puzzle_2()) '// True
Dim Puzzle_3(1 To 9) As Byte = {3, 5, 7, 8, 1, 6, 4, 9, 2} : Print IsMagicSquare(Puzzle_3()) '// False
Dim Puzzle_4(1 To 9) As Byte = {8, 1, 6, 7, 5, 3, 4, 9, 2} : Print IsMagicSquare(Puzzle_4()) '// False
'// 4x4 Squares
Dim Puzzle_5(1 To 16) As Byte = {4,14,15,1,9,7,6,12,5,11,10,8,16,2,3,13} : Print IsMagicSquare(Puzzle_5()) '// True
Dim Puzzle_6(1 To 16) As Byte = {4,14,1,15,9,7,6,12,11,5,10,8,16,2,3,13} : Print IsMagicSquare(Puzzle_6()) '// False
Sleep:end