From: Ben Ford Date: 2007-01-15T00:50:06+09:00 Subject: Re: Number Spiral (#109) Here is my solution. I used a recursive printing routine to handle the insides of the middle rows. Ben class NumberSpiral def initialize(n) @size = n @format = "%#{(n*n - 1).to_s.length+1}d" if n % 2 == 0 @top_row = proc{|x| (x*(x-1)).upto(x*x-1) {|i| print_num(i) } } @bottom_row = proc{|x| ((x-1)*(x-1)).downto((x-1)*(x-2)) {|i| print_num(i) } } @middle_first = proc{|x,row| print_num(x*(x-1)-row) } @middle_last = proc{|x,row| print_num((x-2)*(x-2)-1+row) } else @top_row = proc{|x| ((x-1)*(x-2)).upto((x-1)*(x-1)) {|i| print_num(i) } } @bottom_row = proc{|x| (x*x-1).downto(x*(x-1)) {|i| print_num(i) } } @middle_first = proc{|x,row| print_num((x-1)*(x-2)-row) } @middle_last = proc{|x,row| print_num((x-1)*(x-1)+row) } end end def print_num(i) printf @format, i end def print_row(size, row) if row == 0 @top_row.call(size) elsif row == size - 1 @bottom_row.call(size) else @middle_first.call(size, row) print_row(size-2, row-1) @middle_last.call(size, row) end end def print_clockwise @size.times {|i| print_row(@size, i) ; puts ; puts if i < @size-1 } end end if ARGV.size == 0 or not ARGV[0] =~ /^\d+$/ puts "Usage: #$0 N" puts "Output: Prints a \"spiral\" of numbers that fill a NxN square." else NumberSpiral.new(ARGV[0].to_i).print_clockwise end On Jan 12, 9:29 am, Ruby Quiz wrote: > 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. > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= > > by Bob Showalter > > (Taken from the puzzle by William Wu athttp://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml) > > [Editor's Note: This was also a code golf problem a few months back:http://codegolf.com/oblongular-number-spirals --JEG2] > > Write a Ruby program to print out a "spiral" of numbers that fill a NxN square. > Your program will take a single argument to specify the dimensions of the square > (1 or higher). The number zero represents the center of the spiral, and the > succeeding integers spiral out in a clockwise (or counterclockwise; your choice) > direction from the center until the square is filled. > > Your program should write the output line by line, without using an array to > build up the data first. > > Here's the output for an 8x8 spiral: > > 56 57 58 59 60 61 62 63 > > 55 30 31 32 33 34 35 36 > > 54 29 12 13 14 15 16 37 > > 53 28 11 2 3 4 17 38 > > 52 27 10 1 0 5 18 39 > > 51 26 9 8 7 6 19 40 > > 50 25 24 23 22 21 20 41 > > 49 48 47 46 45 44 43 42