Magic squares of singly even order: Difference between revisions

→‎{{header|Rust}}: Optimization (mut removed)
(→‎{{header|rust}}: Rust version)
(→‎{{header|Rust}}: Optimization (mut removed))
Line 1,584:
 
fn main() {
let argsn: Vec<String>usize = env::args().collect();
match env::args().nth(1).and_then(|arg| arg.parse().ok()).ok_or(
assert!(
"Please specify the size of the magic square, as a positive multiple of 4 plus 2.",
args.len() == 2,{
"Please specify the size of the magic square, as a positive multiple of 4 plus 2."
Ok(arg) if arg % 2 == 1 || arg >= 6 && (arg - 2) % 4 == 0 => arg,
);
let n = args[1].parse::<i32> Err(e).unwrap => panic!(e);,
_ => panic!("Argument must be a positive multiple of 4 plus 2."),
assert!(
n >= 6 && (n - 2) % 4 == 0,};
"Argument must be a positive multiple of 4 plus 2."
);
 
let (ms, mc) = magic_square_singly_even(n);
println!("n: {}", n);
println!("Magic constant: {}\n", mc);
let width = (n * n).to_string().len() + 1;
Line 1,602 ⟶ 1,601:
print!("{e:>w$}", e = elem, w = width);
}
println!("");
}
}
 
fn magic_square_singly_even(n: i32usize) -> (Vec<Vec<i32usize>>, i32usize) {
let size = n * n;
let half = n / 2;
let sub_square_size = size / 4;
let sub_square = magic_square_odd(half);
let quadrant_factors = vec![0, 2, 3, 1];
let mut ms = vec![vec![0; n as usize]; n as usize];
 
for r in 0..n {
for c in 0..n {
let quadrant = (r / half) * 2 + (c / half);
ms[r as usize][c as usize] = sub_square[(r % half) as usize][(c % half) as usize];
ms[r as usize][c as usize] += quadrant_factors[quadrant as usize] * sub_square_size;
}
}
 
let cols_left = half / 2;
let cols_right = cols_left - 1;
 
forlet rms in= (0..half {n)
for c in 0..nmap(|r| {
for r in (0..n {)
if c < cols_left || c >= n - cols_right || c == cols_left && r == cols_left {
if .map(|c == 0 && r == cols_left| {
continue;let localr = if (c < cols_left
} || c >= n - cols_right
let tmp || (c == ms[cols_left && r as% usize][chalf as== usize];cols_left))
ms[r as usize][c as usize] = ms[ && !(rc +== half)0 as&& usize][cr as% usize];half == cols_left)
ms[(r + half) as usize][c as usize] = tmp;{
} if r >= half {
} r - half
i = n - 1; } else {
}
r + half
 
j -= 2; }
i += 1; } else {
continue; r
};
let quadrant = (rlocalr / half) * 2 + (c / half);
ms[r as usize][c as usize] let v = sub_square[(rlocalr % half) as usize][(c % half) as usize];
ms[r as usize][c as usize] v += quadrant_factors[quadrant as usize] * sub_square_size;
for c in 0..n { })
.collect()
});
.collect::<Vec<Vec<_>>>();
(ms, (n * n + 1) * n / 2)
}
 
fn magic_square_odd(n: i32usize) -> Vec<Vec<i32usize>> {
(0..n);
let mut ms = vec![vec![0; n as usize]; n as usize];
let mut i = n.map(|r| / 2;{
let mut j = n - 1; (0..n)
let mut e = 1; .map(|c| {
n * (((c + 1) + (r + 1) - 1 + (n >> 1)) % n)
while e <= n * n {
if i < 0 && j == n { + (((c + 1) + (2 * (r + 1)) - 2) % n)
j = n - 2; + 1
i = 0; })
} else if j == n { .collect::<Vec<_>>()
j = 0;})
} else if i .collect::< 0 {Vec<Vec<_>>>()
i = n - 1;
}
if ms[i as usize][j as usize] > 0 {
j -= 2;
i += 1;
continue;
}
ms[i as usize][j as usize] = e;
e += 1;
j += 1;
i -= 1;
}
ms
}</lang>
{{out}}
<pre>
n: 6
Magic constant: 111
 
2935 73 64 2026 2521 2422
91 32 19 2719 23 1927
3133 37 82 2224 2125 2620
28 3430 3331 1117 1612 1513
3628 5 2836 1810 14 1018
46 3034 3529 1315 1216 1711
 
 
n: 10
Magic constant: 505
 
8492 7898 22 4 16 10 15 11 59 67 53 73 72 54 66 60 40 36
7799 9680 20 6 14 12 818 5274 7155 7056 6462 3343
25 1 94 82 88 19 7 25 151 75 6957 63 5769 2650
9383 8789 20 6 21 5 2 24 58 68 64 62 70 56 71 55 4927
8690 8591 22 4 233 17 9 61 65 60 66 54 72 73 53 42 34
17 9 23 379 9785 9186 9042 3448 2829 4735 41 6561
24 2 215 9581 8987 8393 2749 4630 4531 3937 5868
100 1976 13 7 82 13 76 94 50100 4426 32 38 3244 5175
18 8 12 14 81 95 80 96 99 77 43 33 37 39 31 45 30 46 74 52
1115 1016 7997 9878 9284 3640 3541 2947 4828 6759
 
 
n: 18
Magic constant: 2925
 
290 300 310 320 6 16 26 36 37 209 219 229 239 168 178 107 117 118
301 311 321 250 17 27 28 38 48 220 230 240 169 179 189 109 119 129
312 322 251 261 19 29 39 49 59 231 241 170 180 181 191 120 130 140
323 252 253 263 30 40 50 60 70 242 171 172 182 192 202 131 141 151
1 254 264 274 284 51 61 71 81 163 173 183 193 203 213 142 152 162
255 265 275 285 52 62 72 73 2 174 184 194 204 214 224 153 154 83
266 276 286 296 63 64 74 3 13 185 195 205 215 225 226 155 84 94
277 287 297 298 65 75 4 14 24 196 206 216 217 227 237 85 95 105
288 289 299 309 76 5 15 25 35 207 208 218 228 238 167 96 106 116
47 57 67 77 249 259 269 279 280 128 138 148 158 87 97 188 198 199
58 68 78 7 260 270 271 281 291 139 149 159 88 98 108 190 200 210
69 79 8 18 262 272 282 292 302 150 160 89 99 100 110 201 211 221
80 9 10 20 273 283 293 303 313 161 90 91 101 111 121 212 222 232
244 11 21 31 41 294 304 314 324 82 92 102 112 122 132 223 233 243
12 22 32 42 295 305 315 316 245 93 103 113 123 133 143 234 235 164
23 33 43 53 306 307 317 246 256 104 114 124 134 144 145 236 165 175
34 44 54 55 308 318 247 257 267 115 125 135 136 146 156 166 176 186
45 46 56 66 319 248 258 268 278 126 127 137 147 157 86 177 187 197
</pre>
 
=={{header|zkl}}==
{{trans|Java}}
Anonymous user