⚠️ 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