From: James Edward Gray II Date: 2007-05-21T00:29:23+09:00 Subject: Re: [QUIZ] Magic Squares (#124) This is the solution I made to generate the quiz examples: #!/usr/bin/env ruby -w ### parsing command-line arguments ### begin N = Integer(ARGV.shift) MAX = N ** 2 raise "Bad number" if N < 0 or N % 2 == 0 rescue abort "Usage: #{File.basename($PROGRAM_NAME)} ODD_INTEGER_SIZE" end ### build the square ### square = Array.new(N) { Array.new(N) } x, y = N / 2, 0 1.upto(MAX) do |i| square[y][x] = i x = x.zero? ? square.first.size - 1 : x - 1 y = y.zero? ? square.size - 1 : y - 1 unless square[y][x].nil? x = (x + 1) % square.first.size 2.times { y = (y + 1) % square.size } end end ### validate magic square ### # rows tests = square.dup # columns (0...N).each { |i| tests << square.map { |row| row[i] } } # diagonals tests << (0...N).map { |i| square[i][i] } << (0...N).map { |i| square[N - (i + 1)][i] } # test all sums unless tests.map { |group| group.inject { |sum, n| sum + n } }.uniq.size == 1 raise "Not a magic square" end ### square output ### width = MAX.to_s.size border = "+#{'-' * (width * N + 3 * (N - 1) + 2)}+" puts border square.each do |row| puts "| #{row.map { |f| "%#{width}d" % f }.join(' | ')} |", border end __END__ James Edward Gray II