Magic squares of doubly even order: Difference between revisions

Undo revision 225368 by Steenslag (talk)
(→‎{{header|Ruby}}: Added Ruby)
(Undo revision 225368 by Steenslag (talk))
Line 405:
</pre>
 
=={{header|Rubyzkl}}==
{{trans|Java}}
<lang zkl>class MagicSquareDoublyEven{
fcn init(n){ var result=magicSquareDoublyEven(n) }
fcn toString{
sink,n:=Sink(String),result.len(); // num collumns
fmt:="%2s ";
foreach row in (result)
{ sink.write(row.apply('wrap(n){ fmt.fmt(n) }).concat(),"\n") }
sink.write("\nMagic constant: %d".fmt((n*n + 1)*n/2));
sink.close();
}
fcn magicSquareDoublyEven(n){
if (n<4 or n%4!=0 or n>16)
throw(Exception.ValueError("base must be a positive multiple of 4"));
bits,size,mult:=0b1001011001101001, n*n, n/4;
result:=n.pump(List(),n.pump(List(),0).copy); // array[n,n] of zero
 
foreach i in (size){
<lang ruby>def double_even_magic_square(n)
bitsPos:=(i%n)/mult + (i/(n*mult)*4);
raise ArgumentError, "Need multiple of four" if n%4 > 0
value:=(bits.bitAnd((2).pow(bitsPos))) and i+1 or size-i;
block_size, max = n/4, n*n
result[i/n][i%n]=value;
pre_pat = [true, false, false, true,
}
false, true, true, false]
result;
pre_pat += pre_pat.reverse
}
pattern = pre_pat.flat_map{|b| [b] * block_size} * block_size
}
flat_ar = pattern.each_with_index.map{|yes, num| yes ? num+1 : max-num}
MagicSquareDoublyEven(8).println();</lang>
flat_ar.each_slice(n).to_a
end
 
def to_string(square)
n = square.size
fmt = "%#{(n*n).to_s.size + 1}d" * n
square.inject(""){|str,row| str << fmt % row << "\n"}
end
 
puts to_string(double_even_magic_square(8))</lang>
{{out}}
<pre>
1 2 62 61 60 59 7 8
569 5510 1154 1253 1352 1451 5015 16 49
48 47 19 20 21 22 42 41
2540 2639 3827 3728 3629 3530 3134 33 32
3332 3431 3035 2936 2837 2738 3926 25 40
24 23 43 44 45 46 18 17
1649 1550 5114 5213 5312 5411 1055 56 9
57 58 6 5 4 3 63 64
 
Magic constant: 260
</pre>
1,149

edits