William James
9/26/2007 9:57:00 PM
On Sep 26, 12:16 am, Jay Levitt <jay+n...@jay.fm> wrote:
> I had to write a script this evening to take an unsorted input file of the
> form:
>
> database 1 is on server 3
> database 8 is on server 7
> ...
>
> and output it in the form:
>
> server 3 handles database 1 through 7
> server 7 handles database 8 through 11
>
> My brain was in procedural mode, and I wrote the following ugliness:
>
> ---
>
> def output_range(start_db, end_db, server_n)
> puts "server #{server_n} handles database #{start_db} through #{end_db}"
> end
>
> open("db_list.txt").readlines.each do |line|
> m = line.match(/^database (.*) is on server (.*)/)
> db_n = m[1].to_i
> server_n = m[2].to_i
>
> db_servers[db_n] = server_n
> end
>
> range_start = 1
>
> db_servers.each_index do |i|
> next if i == 1
> if db_servers[i] != db_servers[i - 1]
> output_range(range_start, i - 1, db_servers[i - 1])
> range_start = i
> end
> end
>
> last_db = db_servers.size - 1
> output_range(range_start, last_db, db_servers[last_db])
> ---
>
> which in fact is not only horrid to look at, but has a bug (it doesn't like
> it if the input skips over a database number, i.e. db 233 and 235 are
> present but 234 is missing).
I'm not in the mood for hash.
ary = DATA.readlines
ary.map{|s| s[/\d+$/] }.uniq.each{|server|
db = ary.grep(/ #{server}$/).map{|s|
s[/\d+/].to_i}.sort
puts "Server #{server} databases #{db[0]} to #{db[-1]}"
}
__END__
database 8 is on server 7
database 10 is on server 7
database 9 is on server 7
database 5 is on server 9
database 1 is on server 3
database 2 is on server 3
database 133 is on server 3
database 4 is on server 144