ま、どういうやり方が簡単かは、人によるからね。

class MagicSquare
def initialize(size)
@size = size
@rows = []
@cols = []
size.times{|r|
size.times{|c|
a = (c+r)*2+(size+1)/2+2
b = c-r+(3*size+1)/2
x = (a-1)%size
y = (b-1)%size
z = size*r+c+1
@rows[x] ||= []
@cols[y] ||= []
@rows[x][y] = @cols[y][x] = z
}
}
end
attr_reader :size, :rows, :cols