' Generates Ternary Squares of order 9 for integers 0, 1, 2
' Tested with Office 2007 under Windows 7
Sub Ternary9()
Dim a(81), b(9), s9(3)
y = MsgBox("Locked", vbCritical, "Routine Ternary9")
End
n2 = 0: n9 = 0: k1 = 1: k2 = 1
m1 = 0: m2 = 2: s1 = 9
' Generate data
Sheets("Klad1").Select
t1 = Timer
For j81 = m1 To m2 'a(81)
a(81) = j81
For j80 = m1 To m2 'a(80)
a(80) = j80
For j79 = m1 To m2 'a(79)
a(79) = j79
For j78 = m1 To m2 'a(78)
a(78) = j78
For j77 = m1 To m2 'a(77)
a(77) = j77
For j76 = m1 To m2 'a(76)
a(76) = j76
For j75 = m1 To m2 'a(75)
a(75) = j75
For j74 = m1 To m2 'a(74)
a(74) = j74
a(73) = s1 - a(74) - a(75) - a(76) - a(77) - a(78) - a(79) - a(80) - a(81): If a(73) < m1 Or a(73) > m2 Then GoTo 740
For j72 = m1 To m2 'a(72)
a(72) = j72
For j71 = m1 To m2 'a(71)
a(71) = j71
For j70 = m1 To m2 'a(70)
a(70) = j70
For j69 = m1 To m2 'a(69)
a(69) = j69
For j68 = m1 To m2 'a(68)
a(68) = j68
For j67 = m1 To m2 'a(67)
a(67) = j67
For j66 = m1 To m2 'a(66)
a(66) = j66
For j65 = m1 To m2 'a(65)
a(65) = j65
a(64) = s1 - a(65) - a(66) - a(67) - a(68) - a(69) - a(70) - a(71) - a(72): If a(64) < m1 Or a(64) > m2 Then GoTo 650
For j63 = m1 To m2 'a(63)
a(63) = j63
For j62 = m1 To m2 'a(62)
a(62) = j62
a(61) = s1 - a(62) - a(63) - a(70) - a(71) - a(72) - a(79) - a(80) - a(81): If a(61) < m1 Or a(61) > m2 Then GoTo 620
a(60) = s1 - a(61) - a(62) - a(69) - a(70) - a(71) - a(78) - a(79) - a(80): If a(60) < m1 Or a(60) > m2 Then GoTo 620
a(59) = s1 - a(60) - a(61) - a(68) - a(69) - a(70) - a(77) - a(78) - a(79): If a(59) < m1 Or a(59) > m2 Then GoTo 620
a(58) = s1 - a(59) - a(60) - a(67) - a(68) - a(69) - a(76) - a(77) - a(78): If a(58) < m1 Or a(58) > m2 Then GoTo 620
a(57) = s1 - a(58) - a(59) - a(66) - a(67) - a(68) - a(75) - a(76) - a(77): If a(57) < m1 Or a(57) > m2 Then GoTo 620
a(56) = s1 - a(57) - a(58) - a(65) - a(66) - a(67) - a(74) - a(75) - a(76): If a(56) < m1 Or a(56) > m2 Then GoTo 620
a(55) = s1 - a(56) - a(57) - a(64) - a(65) - a(66) - a(73) - a(74) - a(75): If a(55) < m1 Or a(55) > m2 Then GoTo 620
For j54 = m1 To m2 'a(54)
a(54) = j54
a(27) = s1 / 3 - a(54) - a(75) - a(78) + a(81): If a(27) < m1 Or a(27) > m2 Then GoTo 540
For j53 = m1 To m2 'a(53)
a(53) = j53
a(26) = s1 / 3 - a(53) - a(74) - a(77) + a(80): If a(26) < m1 Or a(26) > m2 Then GoTo 530
a(52) = s1 - a(53) - a(54) - a(61) - a(62) - a(63) - a(70) - a(71) - a(72): If a(52) < m1 Or a(52) > m2 Then GoTo 530
a(51) = s1 - a(52) - a(53) - a(60) - a(61) - a(62) - a(69) - a(70) - a(71): If a(51) < m1 Or a(51) > m2 Then GoTo 530
a(50) = s1 - a(51) - a(52) - a(59) - a(60) - a(61) - a(68) - a(69) - a(70): If a(50) < m1 Or a(50) > m2 Then GoTo 530
a(49) = s1 - a(50) - a(51) - a(58) - a(59) - a(60) - a(67) - a(68) - a(69): If a(49) < m1 Or a(49) > m2 Then GoTo 530
a(48) = s1 - a(49) - a(50) - a(57) - a(58) - a(59) - a(66) - a(67) - a(68): If a(48) < m1 Or a(48) > m2 Then GoTo 530
a(47) = s1 - a(48) - a(49) - a(56) - a(57) - a(58) - a(65) - a(66) - a(67): If a(47) < m1 Or a(47) > m2 Then GoTo 530
a(46) = s1 - a(47) - a(48) - a(55) - a(56) - a(57) - a(64) - a(65) - a(66): If a(46) < m1 Or a(46) > m2 Then GoTo 530
For j45 = m1 To m2 'a(45)
a(45) = j45
a(18) = s1 / 3 - a(45) - a(66) - a(69) + a(72): If a(18) < m1 Or a(18) > m2 Then GoTo 450
For j44 = m1 To m2 'a(44)
a(44) = j44
a(17) = s1 / 3 - a(44) - a(65) - a(68) + a(71): If a(17) < m1 Or a(17) > m2 Then GoTo 440
a(43) = s1 - a(44) - a(45) - a(52) - a(53) - a(54) - a(61) - a(62) - a(63): If a(43) < m1 Or a(43) > m2 Then GoTo 440
a(42) = s1 - a(43) - a(44) - a(51) - a(52) - a(53) - a(60) - a(61) - a(62): If a(42) < m1 Or a(42) > m2 Then GoTo 440
a(41) = s1 - a(42) - a(43) - a(50) - a(51) - a(52) - a(59) - a(60) - a(61): If a(41) < m1 Or a(41) > m2 Then GoTo 440
a(40) = s1 - a(41) - a(42) - a(49) - a(50) - a(51) - a(58) - a(59) - a(60): If a(40) < m1 Or a(40) > m2 Then GoTo 440
a(39) = s1 - a(40) - a(41) - a(48) - a(49) - a(50) - a(57) - a(58) - a(59): If a(39) < m1 Or a(39) > m2 Then GoTo 440
a(38) = s1 - a(39) - a(40) - a(47) - a(48) - a(49) - a(56) - a(57) - a(58): If a(38) < m1 Or a(38) > m2 Then GoTo 440
a(37) = s1 - a(38) - a(39) - a(46) - a(47) - a(48) - a(55) - a(56) - a(57): If a(37) < m1 Or a(37) > m2 Then GoTo 440
For j36 = m1 To m2 'a(36)
a(36) = j36
For j35 = m1 To m2 'a(35)
a(35) = j35
a(34) = s1 - a(35) - a(36) - a(43) - a(44) - a(45) - a(52) - a(53) - a(54): If a(34) < m1 Or a(34) > m2 Then GoTo 350
a(33) = s1 - a(34) - a(35) - a(42) - a(43) - a(44) - a(51) - a(52) - a(53): If a(33) < m1 Or a(33) > m2 Then GoTo 350
a(32) = s1 - a(33) - a(34) - a(41) - a(42) - a(43) - a(50) - a(51) - a(52): If a(32) < m1 Or a(32) > m2 Then GoTo 350
a(31) = s1 - a(32) - a(33) - a(40) - a(41) - a(42) - a(49) - a(50) - a(51): If a(31) < m1 Or a(31) > m2 Then GoTo 350
a(30) = s1 - a(31) - a(32) - a(39) - a(40) - a(41) - a(48) - a(49) - a(50): If a(30) < m1 Or a(30) > m2 Then GoTo 350
a(29) = s1 - a(30) - a(31) - a(38) - a(39) - a(40) - a(47) - a(48) - a(49): If a(29) < m1 Or a(29) > m2 Then GoTo 350
a(28) = s1 - a(29) - a(30) - a(37) - a(38) - a(39) - a(46) - a(47) - a(48): If a(28) < m1 Or a(28) > m2 Then GoTo 350
a(25) = s1 - a(26) - a(27) - a(34) - a(35) - a(36) - a(43) - a(44) - a(45): If a(25) < m1 Or a(25) > m2 Then GoTo 350
a(24) = s1 - a(25) - a(26) - a(33) - a(34) - a(35) - a(42) - a(43) - a(44): If a(24) < m1 Or a(24) > m2 Then GoTo 350
a(23) = s1 - a(24) - a(25) - a(32) - a(33) - a(34) - a(41) - a(42) - a(43): If a(23) < m1 Or a(23) > m2 Then GoTo 350
a(22) = s1 - a(23) - a(24) - a(31) - a(32) - a(33) - a(40) - a(41) - a(42): If a(22) < m1 Or a(22) > m2 Then GoTo 350
a(21) = s1 - a(22) - a(23) - a(30) - a(31) - a(32) - a(39) - a(40) - a(41): If a(21) < m1 Or a(21) > m2 Then GoTo 350
a(20) = s1 - a(21) - a(22) - a(29) - a(30) - a(31) - a(38) - a(39) - a(40): If a(20) < m1 Or a(20) > m2 Then GoTo 350
a(19) = s1 - a(20) - a(21) - a(28) - a(29) - a(30) - a(37) - a(38) - a(39): If a(19) < m1 Or a(19) > m2 Then GoTo 350
a(16) = s1 - a(17) - a(18) - a(25) - a(26) - a(27) - a(34) - a(35) - a(36): If a(16) < m1 Or a(16) > m2 Then GoTo 350
a(15) = s1 - a(16) - a(17) - a(24) - a(25) - a(26) - a(33) - a(34) - a(35): If a(15) < m1 Or a(15) > m2 Then GoTo 350
a(14) = s1 - a(15) - a(16) - a(23) - a(24) - a(25) - a(32) - a(33) - a(34): If a(14) < m1 Or a(14) > m2 Then GoTo 350
a(13) = s1 - a(14) - a(15) - a(22) - a(23) - a(24) - a(31) - a(32) - a(33): If a(13) < m1 Or a(13) > m2 Then GoTo 350
a(12) = s1 - a(13) - a(14) - a(21) - a(22) - a(23) - a(30) - a(31) - a(32): If a(12) < m1 Or a(12) > m2 Then GoTo 350
a(11) = s1 - a(12) - a(13) - a(20) - a(21) - a(22) - a(29) - a(30) - a(31): If a(11) < m1 Or a(11) > m2 Then GoTo 350
a(10) = s1 - a(11) - a(12) - a(19) - a(20) - a(21) - a(28) - a(29) - a(30): If a(10) < m1 Or a(10) > m2 Then GoTo 350
a(9) = s1 - a(17) - a(25) - a(33) - a(41) - a(49) - a(57) - a(65) - a(73): If a(9) < m1 Or a(9) > m2 Then GoTo 350
a(8) = s1 - a(16) - a(24) - a(32) - a(40) - a(48) - a(56) - a(64) - a(81): If a(8) < m1 Or a(8) > m2 Then GoTo 350
a(7) = s1 - a(8) - a(9) - a(16) - a(17) - a(18) - a(25) - a(26) - a(27): If a(7) < m1 Or a(7) > m2 Then GoTo 350
a(6) = s1 - a(7) - a(8) - a(15) - a(16) - a(17) - a(24) - a(25) - a(26): If a(6) < m1 Or a(6) > m2 Then GoTo 350
a(5) = s1 - a(6) - a(7) - a(14) - a(15) - a(16) - a(23) - a(24) - a(25): If a(5) < m1 Or a(5) > m2 Then GoTo 350
a(4) = s1 - a(5) - a(6) - a(13) - a(14) - a(15) - a(22) - a(23) - a(24): If a(4) < m1 Or a(4) > m2 Then GoTo 350
a(3) = s1 - a(4) - a(5) - a(12) - a(13) - a(14) - a(21) - a(22) - a(23): If a(3) < m1 Or a(3) > m2 Then GoTo 350
a(2) = s1 - a(3) - a(4) - a(11) - a(12) - a(13) - a(20) - a(21) - a(22): If a(2) < m1 Or a(2) > m2 Then GoTo 350
a(1) = s1 - a(2) - a(3) - a(10) - a(11) - a(12) - a(19) - a(20) - a(21): If a(1) < m1 Or a(1) > m2 Then GoTo 350
' Exclude solutions with more than 3 times 0, 1 and 2
' in rows, columns, diagonals and sub squares (partly compact only)
GoSub 1800: If fl1 = 0 Then GoTo 350
n9 = n9 + 1
GoSub 2650 'Print results (squares)
' GoSub 2645 'Print results (selected numbers)
350 Next j35
360 Next j36
440 Next j44
450 Next j45
530 Next j53
540 Next j54
620 Next j62
630 Next j63
650 Next j65
660 Next j66
670 Next j67
680 Next j68
690 Next j69
700 Next j70
710 Next j71
720 Next j72
740 Next j74
750 Next j75
760 Next j76
770 Next j77
780 Next j78
790 Next j79
800 Next j80
810 Next j81
t2 = Timer
t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
y = MsgBox(t10, 0, "Routine Ternary9")
End
' Exclude solutions with more than 3 times 0, 1 and 2
' in rows, columns, diagonals and sub squares (partly compact only)
1800 fl1 = 1
' Rows
i1 = -8
For i0 = 1 To 9
i1 = i1 + 9
b(1) = a(i1): b(2) = a(i1 + 1): b(3) = a(i1 + 2): b(4) = a(i1 + 3): b(5) = a(i1 + 4)
b(6) = a(i1 + 5): b(7) = a(i1 + 6): b(8) = a(i1 + 7): b(9) = a(i1 + 8)
GoSub 1860: If fl1 = 0 Then Return
Next i0
' Columns
i1 = 0
For i0 = 1 To 9
i1 = i1 + 1
b(1) = a(i1): b(2) = a(i1 + 9): b(3) = a(i1 + 18): b(4) = a(i1 + 27): b(5) = a(i1 + 36)
b(6) = a(i1 + 45): b(7) = a(i1 + 54): b(8) = a(i1 + 63): b(9) = a(i1 + 72)
GoSub 1860: If fl1 = 0 Then Return
Next i0
' Main Diagonals
b(1) = a(1): b(2) = a(11): b(3) = a(21): b(4) = a(31): b(5) = a(41): b(6) = a(51): b(7) = a(61): b(8) = a(71): b(9) = a(81):
GoSub 1860: If fl1 = 0 Then Return
b(1) = a(9): b(2) = a(17): b(3) = a(25): b(4) = a(33): b(5) = a(41): b(6) = a(49): b(7) = a(57): b(8) = a(65): b(9) = a(73):
GoSub 1860: If fl1 = 0 Then Return
' Sub Squares 3 x 3 (left to right)
For i1 = 1 To 3 'Check 27 Squares
i22 = (i1 - 1) * 27
For i2 = 1 To 9
i11 = i2:
i12 = (i11 + 1) Mod 9: If i12 = 0 Then i12 = 9
i13 = (i12 + 1) Mod 9: If i13 = 0 Then i13 = 9
b(1) = a(i22 + i11): b(2) = a(i22 + i12): b(3) = a(i22 + i13)
b(4) = a(i22 + i11 + 9): b(5) = a(i22 + i12 + 9): b(6) = a(i22 + i13 + 9)
b(7) = a(i22 + i11 + 18): b(8) = a(i22 + i12 + 18): b(9) = a(i22 + i13 + 18)
GoSub 1860: If fl1 = 0 Then Return
Next i2
Next i1
For i1 = 1 To 5 'Check 12 Squares
If i1 <> 3 Then
i22 = 9 + (i1 - 1) * 9
For i2 = 1 To 9 Step 3
i11 = i2
i12 = (i11 + 1) Mod 9: If i12 = 0 Then i12 = 9
i13 = (i12 + 1) Mod 9: If i13 = 0 Then i13 = 9
b(1) = a(i22 + i11): b(2) = a(i22 + i12): b(3) = a(i22 + i13)
b(4) = a(i22 + i11 + 9): b(5) = a(i22 + i12 + 9): b(6) = a(i22 + i13 + 9)
b(7) = a(i22 + i11 + 18): b(8) = a(i22 + i12 + 18): b(9) = a(i22 + i13 + 18)
GoSub 1860: If fl1 = 0 Then Return
Next i2
End If
Next i1
' Check 6 Squares
b(1) = a(64): b(2) = a(65): b(3) = a(66): b(4) = a(73): b(5) = a(74): b(6) = a(75): b(7) = a(1): b(8) = a(2): b(9) = a(3):
GoSub 1860: If fl1 = 0 Then Return
b(1) = a(67): b(2) = a(68): b(3) = a(69): b(4) = a(76): b(5) = a(77): b(6) = a(78): b(7) = a(4): b(8) = a(5): b(9) = a(6):
GoSub 1860: If fl1 = 0 Then Return
b(1) = a(70): b(2) = a(71): b(3) = a(72): b(4) = a(79): b(5) = a(80): b(6) = a(81): b(7) = a(7): b(8) = a(8): b(9) = a(9):
GoSub 1860: If fl1 = 0 Then Return
b(1) = a(73): b(2) = a(74): b(3) = a(75): b(4) = a(1): b(5) = a(2): b(6) = a(3): b(7) = a(10): b(8) = a(11): b(9) = a(12):
GoSub 1860: If fl1 = 0 Then Return
b(1) = a(76): b(2) = a(77): b(3) = a(78): b(4) = a(4): b(5) = a(5): b(6) = a(6): b(7) = a(13): b(8) = a(14): b(9) = a(15):
GoSub 1860: If fl1 = 0 Then Return
b(1) = a(79): b(2) = a(80): b(3) = a(81): b(4) = a(7): b(5) = a(8): b(6) = a(9): b(7) = a(16): b(8) = a(17): b(9) = a(18):
GoSub 1860: If fl1 = 0 Then Return
Return
' Count 0, 1 , 2
1860 fl1 = 1
Erase s9
For j1 = 1 To 9
j2 = b(j1): s9(j2) = s9(j2) + 1
If s9(j2) > 3 Then fl1 = 0: Return
Next j1
Return
' Print results (selected numbers)
2645 For i1 = 1 To 81
Cells(n9, i1).Value = a(i1)
Next i1
Cells(n9, 81).Select
Return
' Print results (squares)
2650 n2 = n2 + 1
If n2 = 5 Then
n2 = 1: k1 = k1 + 10: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 10
End If
Cells(k1, k2 + 1).Select
Cells(k1, k2 + 1).Font.Color = -4165632
Cells(k1, k2 + 1).Value = CStr(n9)
i3 = 0
For i1 = 1 To 9
For i2 = 1 To 9
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a(i3)
Next i2
Next i1
Return
End Sub