i didn't feel like golfing before coffee, but here's one:
harp:~ > cat a.rb
class ExcelRange < ::Array
def initialize spec
a, b = spec.to_str.split %r/
alpha_a, numeric_a = a.split %r/(\d+)/
alpha_b, numeric_b = b.split %r/(\d+)/
a = alpha_a ? (alpha_a .. alpha_b).to_a :
b = numeric_a ? (numeric_a .. numeric_b).to_a :
case [a.empty?, b.empty?]
when [true, true]
# nil
when [true, false]
replace b
when [false, true]
replace a
when [false, false]
a.each{|alpha| push(*b.map{|numeric| "%s%d" % [alpha, numeric]})}
end
end
end
def ExcelRange(*a, &b) ExcelRange.new(*a, &b) end
p ExcelRange("C5:E8")
p ExcelRange("A:C")
p ExcelRange("12:15")
harp:~ > ruby a.rb
["C5", "C6", "C7", "C8", "D5", "D6", "D7", "D8", "E5", "E6", "E7", "E8"]
["A", "B", "C"]
["12", "13", "14", "15"]
regards.
-a
···
On Sat, 27 May 2006, 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"]
Ideally, this should also work for a partial range like "A:C" => ["A",
"B", "C"] and "12:15" => ["12","13","14","15"]
Extra points for style and bonus kudos for a one-liner.
--
be kind whenever possible... it is always possible.
- h.h. the 14th dali lama