Magic squares/Lua: Difference between revisions

From Rosetta Code
Content added Content deleted
(Created page with "=={{header|Lua}}== <lang lua> function makeArray( s ) local q = {} for j = 1, s do table.insert( q, {} ) for i = 1, s do table.insert( q[j]...")
 
No edit summary
Line 107: Line 107:


io.write( "\nSingly Even Magic Square" )
io.write( "\nSingly Even Magic Square" )
display( buildSEMS( 10 ) )
display( buildSEMS( 6 ) )


io.write( "\nDoubly Even Magic Square" )
io.write( "\nDoubly Even Magic Square" )
Line 126: Line 126:
Magic sum: 369
Magic sum: 369


Singly Even Magic Square - 10 x 10
Singly Even Magic Square - 6 x 6
35 01 06 26 19 24
092 099 001 008 015 067 074 051 058 040
03 32 07 21 23 25
098 080 007 014 016 073 055 057 064 041
31 09 02 22 27 20
004 081 088 020 022 054 056 063 070 047
08 28 33 17 10 15
085 087 019 021 003 060 062 069 071 028
30 05 34 12 14 16
086 093 025 002 009 061 068 075 052 034
04 36 29 13 18 11
017 024 076 083 090 042 049 026 033 065
Magic sum: 111
023 005 082 089 091 048 030 032 039 066
079 006 013 095 097 029 031 038 045 072
010 012 094 096 078 035 037 044 046 053
011 018 100 077 084 036 043 050 027 059
Magic sum: 505


Doubly Even Magic Square - 8 x 8
Doubly Even Magic Square - 8 x 8

Revision as of 07:46, 31 May 2017

Lua

<lang 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 ) )

</lang>

Output:

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