Hey,
Did anyone else run into the problem of trying to setup your square using:
Array.new(size, Array.new(size))
that was annoying! And I wasted too much time with formating the output.
http://pastie.caboo.se/63288
#!/usr/bin/env ruby
# Douglas Meyer
class Array
def sum
inject(0){|a,v|a+=v}
end
end
rows = ARGV[0].to_i
puts "Sorry, this program only works for odd row values!" if rows % 2 == 0
row_sum = (1..rows**2).to_a.sum/rows
puts "Row Sum: #{row_sum}"
decimals = (Math::log(row_sum)/Math::log(10)).to_i
square = Array.new(rows){Array.new(rows, 0)}
row = (rand*rows+1).to_i
col = (rand*rows+1).to_i
#Computer square
(1..rows**2).each do |count|
row = (row - 1) % rows
col = (col - 1) % rows
square[row][col] = count
unless square[(row-1)%rows][(col-1)%rows] == 0
col -= 2
row -= 1
end
end
#Display and check sums
string = "% #{decimals+2}d"*rows+" = % #{decimals+1}d"
square.each{ |row|
output = row
output << row.sum
puts string % output
}
puts (" "*(decimals)+"= ")*rows
string = "% #{decimals+2}d"*rows
puts string % square.inject(Array.new(rows,0)){|sum,row|
sum = sum.zip(row).map{|a|a.sum}
}
On 5/21/07, David Tran <email55555 / gmail.com> wrote:
> Hi,
>
> Updated again on SinglyEvenMagicSquare class. ( shorter )
> Basically, it almost remains the same.
>
> Don't like to post too many emails when I find/try to improve my
> program on the details ...
> If you read my previous 2 post solution, and like to see the "little"
> change, please go to my blog: ( it will have my last updated version )
>
> http://davidtran.doublegifts.com/blog/?p=27
>
> otherwise, I am sorry to bother you on the mailing list.
>
> regards,
> David Tran
>
>