Magic squares of odd order

From Rosetta Code
Revision as of 00:20, 21 March 2014 by Thundergnat (talk | contribs) (→‎{{header|Perl 6}}: remove excessive whitespace, add error trapping)
Magic squares of odd order is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

A magic square is a   NxN   square matrix whose numbers (usually integers) consist of consecutive numbers arranged so that the sum of each row and column, and both long (main) diagonals are equal to the same sum (which is called the magic number or magic constant).

The numbers are usually (but not always) the 1st   N2   positive integers.

A magic square whose rows and columns add up to a magic number   but   whose main diagonals do not, is known as a semimagic square.

task requirements

For any odd   N,   generate a magic square with the integers   1 ──► N2   and show the results.

Optionally, show the magic number.

Use an   N   of   5   for the first example.

Also see


C

<lang c>#include <stdio.h>

  1. include <stdlib.h>

int main(int argc, char **argv) {

  1. define M(x) ((x + n - 1) % n)
       int i, j, k, n, *m;
       char fmt[16];
       if (argc < 2 || (n = atoi(argv[1])) <= 0 || !(n&1))
               fprintf(stderr, "forcing size %d\n", n = 5);
       m = calloc(n*n, sizeof(*m));
       i = 0, j = n/2;
       for (k = 1; k <= n*n; k++) {
               m[i*n + j] = k;
               if (m[M(i)*n + M(j)])
                       i = (i+1) % n;
               else
                       i = M(i), j = M(j);
       }
       for (i = 2, j = 1; j <= n*n; ++i, j *= 10);
       sprintf(fmt, "%%%dd", i);
       for (i = 0; i < n; i++) {
               for (j = 0; j < n; j++)
                       printf(fmt, m[i*n + j]);
               putchar('\n');
       }
       return 0;

}</lang>

Output:
% ./a.out
forcing size 5
  15   8   1  24  17
  16  14   7   5  23
  22  20  13   6   4
   3  21  19  12  10
   9   2  25  18  11

Perl 6

<lang perl6>sub MAIN (Int $n = 5) {

   note "Sorry, must be a positive odd integer." and exit if $n %% 2 or $n < 0;
   my ($x, $y, $i, @sq) = $n/2, 0, 1;
   @sq[($i % $n ?? $y-- !! $y++) % $n][($x % $n ?? $x++ !! $x) % $n] = $i++ for ^($n * $n);
   say $_>>.fmt("%{$i.chars}d") for @sq;
   say "\nThe magic number is ", [+] @sq[0].list;

}</lang>

Output:

Default, No parameter:

24 15  1 17  8
14  5 16  7 23
 4 20  6 22 13
19 10 21 12  3
 9 25 11  2 18

The magic number is 65

With a parameter of 19

106 297 127 318 148 339 169 360 190   1 192  22 213  43 234  64 255  85 276
296 126 317 147 338 168 359 189  19 191  21 212  42 233  63 254  84 275 105
125 316 146 337 167 358 188  18 209  20 211  41 232  62 253  83 274 104 295
315 145 336 166 357 187  17 208  38 210  40 231  61 252  82 273 103 294 124
144 335 165 356 186  16 207  37 228  39 230  60 251  81 272 102 293 123 314
334 164 355 185  15 206  36 227  57 229  59 250  80 271 101 292 122 313 143
163 354 184  14 205  35 226  56 247  58 249  79 270 100 291 121 312 142 333
353 183  13 204  34 225  55 246  76 248  78 269  99 290 120 311 141 332 162
182  12 203  33 224  54 245  75 266  77 268  98 289 119 310 140 331 161 352
 11 202  32 223  53 244  74 265  95 267  97 288 118 309 139 330 160 351 181
201  31 222  52 243  73 264  94 285  96 287 117 308 138 329 159 350 180  10
 30 221  51 242  72 263  93 284 114 286 116 307 137 328 158 349 179   9 200
220  50 241  71 262  92 283 113 304 115 306 136 327 157 348 178   8 199  29
 49 240  70 261  91 282 112 303 133 305 135 326 156 347 177   7 198  28 219
239  69 260  90 281 111 302 132 323 134 325 155 346 176   6 197  27 218  48
 68 259  89 280 110 301 131 322 152 324 154 345 175   5 196  26 217  47 238
258  88 279 109 300 130 321 151 342 153 344 174   4 195  25 216  46 237  67
 87 278 108 299 129 320 150 341 171 343 173   3 194  24 215  45 236  66 257
277 107 298 128 319 149 340 170 361 172   2 193  23 214  44 235  65 256  86
 

The magic number is 3439

REXX

<lang rexx>/*REXX program generates and displays true magic squares (for odd N). */ parse arg N .; if N== then N=5 /*matrix size ¬given? Use default*/ w=length(N*N); r=2; c=(n+1)%2-1 /*define initial row and column. */ @.=. /* [↓] uses the Siamese method.*/

   do j=1  for n*n;   br=r==N & c==N; r=r-1;  c=c+1   /*BR=bottom right*/
   if r<1 & c>N then do;  r=r+2;  c=c-1;    end       /*R under, C over*/
   if r<1       then r=n; if r>n  then r=1; if c>n then c=1  /*overflow*/
   if @.r.c\==. then do; r=r+2; c=c-1; if br then do; r=N; c=c+1; end;end
   @.r.c=j                            /*assign #───►square matrix cell.*/
   end   /*j*/                        /* [↑]  can handle even N matrix.*/
                                      /* [↓]  displays (aligned) matrix*/
      do   r=1  for N;  _=            /*display 1 matrix row at a time.*/
        do c=1  for N;  _=_ right(@.r.c, w);  end  /*c*/    /*build row*/
      say substr(_,2)                 /*row has an extra leading blank.*/
      end   /*c*/                     /* [↑]   also right-justified #s.*/

say /*might as well show a blank line*/ if N//2 then say 'The magic number (or magic constant is): ' N*(n*n+1)%2

                                      /*stick a fork in it, we're done.*/</lang>

output   using the default input of   5:

17 24  1  8 15
23  5  7 14 16
 4  6 13 20 22
10 12 19 21  3
11 18 25  2  9

The magic number  (or magic constant is):  65

output   using the default input of   3:

8 1 6
3 5 7
4 9 2

The magic number  (or magic constant is):  15

output   using the input of:   19:

192 213 234 255 276 297 318 339 360   1  22  43  64  85 106 127 148 169 190
212 233 254 275 296 317 338 359  19  21  42  63  84 105 126 147 168 189 191
232 253 274 295 316 337 358  18  20  41  62  83 104 125 146 167 188 209 211
252 273 294 315 336 357  17  38  40  61  82 103 124 145 166 187 208 210 231
272 293 314 335 356  16  37  39  60  81 102 123 144 165 186 207 228 230 251
292 313 334 355  15  36  57  59  80 101 122 143 164 185 206 227 229 250 271
312 333 354  14  35  56  58  79 100 121 142 163 184 205 226 247 249 270 291
332 353  13  34  55  76  78  99 120 141 162 183 204 225 246 248 269 290 311
352  12  33  54  75  77  98 119 140 161 182 203 224 245 266 268 289 310 331
 11  32  53  74  95  97 118 139 160 181 202 223 244 265 267 288 309 330 351
 31  52  73  94  96 117 138 159 180 201 222 243 264 285 287 308 329 350  10
 51  72  93 114 116 137 158 179 200 221 242 263 284 286 307 328 349   9  30
 71  92 113 115 136 157 178 199 220 241 262 283 304 306 327 348   8  29  50
 91 112 133 135 156 177 198 219 240 261 282 303 305 326 347   7  28  49  70
111 132 134 155 176 197 218 239 260 281 302 323 325 346   6  27  48  69  90
131 152 154 175 196 217 238 259 280 301 322 324 345   5  26  47  68  89 110
151 153 174 195 216 237 258 279 300 321 342 344   4  25  46  67  88 109 130
171 173 194 215 236 257 278 299 320 341 343   3  24  45  66  87 108 129 150
172 193 214 235 256 277 298 319 340 361   2  23  44  65  86 107 128 149 170

The magic number  (or magic constant is):  3439