⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
Lua
function makeArray( s )
local q = {}
for j = 1, s do
table.insert( q, {} )
for i = 1, s do
table.insert( q[j], 0 )
end
end
return q
end
-- [[ odd magic square ]] --
function buildOMS( s )
if s % 2 == 0 then s = s + 1 end
local q, p = makeArray( s ), 1
local i, j, ti, tj = 1 + math.floor( s / 2 ), 1
while( p <= s * s ) do
q[i][j] = p
ti = i + 1; if ti > s then ti = 1 end
tj = j - 1; if tj < 1 then tj = s end
if q[ti][tj] ~= 0 then
ti = i; tj = j + 1
end
i = ti; j = tj; p = p + 1;
end
return q, s
end
-- [[ singly even magic square ]] --
function buildSEMS( s )
if s % 2 == 1 then s = s + 1 end
while( s % 4 == 0 ) do s = s + 2 end
local q, z, o = makeArray( s ), math.floor( s / 2 )
local b, c, d, a = z * z; c = 2 * b; d = 3 * b
o = buildOMS( z )
for j = 1, z do
for i = 1, z do
a = o[i][j]
q[i][j] = a
q[i + z][j + z] = a + b
q[i + z][j] = a + c
q[i][j + z] = a + d
end
end
local lc = math.floor( z / 2 )
local rc, t = lc - 1
for j = 1, z do
for i = 1, s do
if i <= lc or i > s - rc or ( i == lc + 1 and j == lc + 1 ) then
if not( i == 1 and j == lc+ 1 ) then
t = q[i][j]
q[i][j] = q[i][j + z]
q[i][j + z] = t
end
end
end
end
return q, s
end
-- [[ doubly even magic square ]] --
function buildDEMS( s )
while( s % 4 > 0 ) do s = s + 1 end
local q = makeArray( s )
local temp, n, tot, sx, sy = {{1,0,0,1}, {0,1,1,0}, {0,1,1,0}, {1,0,0,1}},
0, s * s
for j = 1, s do
for i = 1, s do
sx = i % 4; if sx < 1 then sx = 4 end
sy = j % 4; if sy < 1 then sy = 4 end
if temp[sy][sx] == 1 then q[i][j] = n + 1
else q[i][j] = tot - n end
n = n + 1
end
end
return q, s
end
function myFormat( s, l )
for i = 1, l - #s do
s = "0" .. s
end
return s .. " "
end
LOG_10 = 2.302585092994
function display( q, s )
io.write( string.format( " - %d x %d\n", s, s ) )
local k = 1 + math.floor( math.log( s * s ) / LOG_10 )
for j = 1, s do
for i = 1, s do
io.write( myFormat( string.format( "%d", q[i][j] ), k ) )
end
print()
end
io.write( string.format( "Magic sum: %d\n", s * ( ( s * s ) + 1 ) / 2 ) )
end
--[[ entry point ]]--
io.write( "\nOdd Magic Square" )
display( buildOMS( 9 ) )
io.write( "\nSingly Even Magic Square" )
display( buildSEMS( 6 ) )
io.write( "\nDoubly Even Magic Square" )
display( buildDEMS( 8 ) )
{{out}}
Odd Magic Square - 9 x 9
47 58 69 80 01 12 23 34 45
57 68 79 09 11 22 33 44 46
67 78 08 10 21 32 43 54 56
77 07 18 20 31 42 53 55 66
06 17 19 30 41 52 63 65 76
16 27 29 40 51 62 64 75 05
26 28 39 50 61 72 74 04 15
36 38 49 60 71 73 03 14 25
37 48 59 70 81 02 13 24 35
Magic sum: 369
Singly Even Magic Square - 6 x 6
35 01 06 26 19 24
03 32 07 21 23 25
31 09 02 22 27 20
08 28 33 17 10 15
30 05 34 12 14 16
04 36 29 13 18 11
Magic sum: 111
Doubly Even Magic Square - 8 x 8
01 63 62 04 05 59 58 08
56 10 11 53 52 14 15 49
48 18 19 45 44 22 23 41
25 39 38 28 29 35 34 32
33 31 30 36 37 27 26 40
24 42 43 21 20 46 47 17
16 50 51 13 12 54 55 09
57 07 06 60 61 03 02 64
Magic sum: 260