Kevin Olbrich wrote: > James Gray wrote: >> On May 27, 2006, at 7:36 AM, Kevin Olbrich wrote: >> >>> Here's a simple problem that seems like a good Ruby exercise. >>> >>> Given a string containing an Excel-like range specifier like this: >>> "C5:E8", generate an array of all the cells in the array. >>> >>> In this case, the output should be something like this.... >>> >>> ["C5", "C6", "C7", "C8", "D5", "D6", "D7", "D8", "E5", "E6", "E7", >>> "E8"] >> >> >> cell_range = "C5:E8" >> => "C5:E8" >> >> from, to = cell_range.split(":") >> => ["C5", "E8"] >> >> cells = (from[/[A-Z]+/]..to[/[A-Z]+/]).map do |col| >> ?> (from[/\d+/]..to[/\d+/]).map { |row| col + row } >> >> end.flatten >> => ["C5", "C6", "C7", "C8", "D5", "D6", "D7", "D8", "E5", "E6", "E7", >> "E8"] >> >> James Edward Gray II > > James' solution gets points for style, but a's is the most complete. > > Good stuff guys, I always learn some good ruby fu from this list. > > _Kevin Here's a variation of James' solution that covers the other cases and is a bit more robust (i.e., it works if the columns are lowercase, and if you specify the range backwards.. def excelrange(r) from, to = r.upcase.split(":").sort begin cells = (from[/[A-Z]+/]..to[/[A-Z]+/]).map do |col| (from[/\d+/]..to[/\d+/]).map { |row| col + row } end.flatten rescue cells = (from..to).to_a end end excelrange("A4:B6") => ["A4", "A5","A6","B4","B5","B6"] excelrange("B6:A4") => ["A4", "A5","A6","B4","B5","B6"] excelrange("4:6") => ["4","5","6"] excelrange("A:B") => ["A","B"] -- Posted via http://www.ruby-forum.com/.