Magic squares of odd order: Difference between revisions
Thundergnat (talk | contribs) (→{{header|Perl 6}}: Added Perl 6 implementation) |
|||
Line 65: | Line 65: | ||
9 2 25 18 11 |
9 2 25 18 11 |
||
</pre> |
</pre> |
||
=={{header|Perl 6}}== |
|||
<lang perl6>sub MAIN ($n = 5) { |
|||
note "Sorry, must be an odd integer." and exit if $n %% 2; |
|||
my ($x, $y, $i, @sq) = $n/2, 0, 1; |
|||
@sq[($i % $n ?? $y-- !! $y++) % $n][($x % $n ?? $x++ !! $x) % $n] = $i++ for ^($n**2); |
|||
say $_>>.fmt("%{$i.chars}d ") for @sq; |
|||
say "\nThe magic number is ", [+] @sq[0].list; |
|||
}</lang> |
|||
{{out}} |
|||
Default, No parameter: |
|||
<pre>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</pre> |
|||
With a parameter of 19 |
|||
<pre>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</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |
Revision as of 00:11, 21 March 2014
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
- Wiki entry: Method_for_constructing_a_magic_square_of_odd_order
- MathWorld (TM) entry: Magic_square
C
<lang c>#include <stdio.h>
- include <stdlib.h>
int main(int argc, char **argv) {
- 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 ($n = 5) {
note "Sorry, must be an odd integer." and exit if $n %% 2;
my ($x, $y, $i, @sq) = $n/2, 0, 1;
@sq[($i % $n ?? $y-- !! $y++) % $n][($x % $n ?? $x++ !! $x) % $n] = $i++ for ^($n**2);
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