From: Ruby Quiz Date: 2007-05-18T20:57:38+09:00 Subject: [QUIZ] Magic Squares (#124) The three rules of Ruby Quiz: 1. Please do not post any solutions or spoiler discussion for this quiz until 48 hours have passed from the time on this message. 2. Support Ruby Quiz by submitting ideas as often as you can: http://www.rubyquiz.com/ 3. Enjoy! Suggestion: A [QUIZ] in the subject of emails about the problem helps everyone on Ruby Talk follow the discussion. Please reply to the original quiz message, if you can. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= A magic square of size N is a square with the numbers from 1 to N ** 2 arranged so that each row, column, and the two long diagonals have the same sum. For example, a magic square for N = 5 could be: +------------------------+ | 15 | 8 | 1 | 24 | 17 | +------------------------+ | 16 | 14 | 7 | 5 | 23 | +------------------------+ | 22 | 20 | 13 | 6 | 4 | +------------------------+ | 3 | 21 | 19 | 12 | 10 | +------------------------+ | 9 | 2 | 25 | 18 | 11 | +------------------------+ In this case the magic sum is 65. All rows, columns, and both diagonals add up to that. This week's Ruby Quiz is to write a program that builds magic squares. To keep the problem easy, I will say that your program only needs to work for odd values of N. Try to keep your runtimes pretty reasonable even for the bigger values of N: $ time ruby magic_square.rb 9 +--------------------------------------------+ | 45 | 34 | 23 | 12 | 1 | 80 | 69 | 58 | 47 | +--------------------------------------------+ | 46 | 44 | 33 | 22 | 11 | 9 | 79 | 68 | 57 | +--------------------------------------------+ | 56 | 54 | 43 | 32 | 21 | 10 | 8 | 78 | 67 | +--------------------------------------------+ | 66 | 55 | 53 | 42 | 31 | 20 | 18 | 7 | 77 | +--------------------------------------------+ | 76 | 65 | 63 | 52 | 41 | 30 | 19 | 17 | 6 | +--------------------------------------------+ | 5 | 75 | 64 | 62 | 51 | 40 | 29 | 27 | 16 | +--------------------------------------------+ | 15 | 4 | 74 | 72 | 61 | 50 | 39 | 28 | 26 | +--------------------------------------------+ | 25 | 14 | 3 | 73 | 71 | 60 | 49 | 38 | 36 | +--------------------------------------------+ | 35 | 24 | 13 | 2 | 81 | 70 | 59 | 48 | 37 | +--------------------------------------------+ real 0m0.012s user 0m0.006s sys 0m0.006s For extra credit, support even values of N. You don't need to worry about N = 2 though as it is impossible.