[#389739] Ruby Challenge — teresa nuagen <unguyen90@...>

Here is a ruby challenge for all you computer science lovers out there,

22 messages 2011/11/05
[#389769] Re: Ruby Challenge — "Jonan S." <jonanscheffler@...> 2011/11/05

Totally unrelated to any husker computer science programs right? Like

[#389905] Re: Ruby Challenge — Stephen Ramsay <sramsay.unl@...> 2011/11/09

Jonan S. wrote in post #1030330:

[#389907] Re: Ruby Challenge — aseret nuagen <unguyen90@...> 2011/11/09

> You mean like the professor for the course? Because that would be me .

[#389915] Re: Ruby Challenge — Robert Klemme <shortcutter@...> 2011/11/09

On Wed, Nov 9, 2011 at 4:52 AM, aseret nuagen <unguyen90@aim.com> wrote:

[#389792] Tricky DSL, how to do it? — Intransition <transfire@...>

I'd want to write a DSL such that a surface method_missing catches

18 messages 2011/11/06

[#389858] Compiling Ruby Inline C code - resolving errors — Martin Hansen <mail@...>

I am trying to get this Ruby inline C code http://pastie.org/2825882 to

12 messages 2011/11/08

[#389928] Forming a Ruby meetup group... — "Darryl L. Pierce" <mcpierce@...>

Where I work we have a local Ruby group that used to meet up, until the

12 messages 2011/11/09

[#389950] The faster way to read files — "Noé Alejandro" <casanejo@...>

Does anybody know which is the fastest way to read a file? Lets say

18 messages 2011/11/09

[#390064] referring to version numbers in a gem — Chad Perrin <code@...>

How do I specify and access a gem's version number within the code of the

28 messages 2011/11/11

[#390238] RVM problem, plz help — Misha Ognev <b1368810@...>

Hi, I have this problem:

15 messages 2011/11/16

[#390308] any command line tools for querying yaml files — Rahul Kumar <sentinel1879@...>

(Sorry, this is not exactly a ruby question).

11 messages 2011/11/18

[#390338] Newbie - cmd question — Otto Dydakt <ottodydakt@...>

I've literally JUST downloaded ruby from rubyinstaller.org.

21 messages 2011/11/19
[#390342] Re: Newbie - cmd question — Otto Dydakt <ottodydakt@...> 2011/11/19

OK thank you, I uninstalled & reinstalled, checking the three boxes at

[#390343] Re: Newbie - cmd question — "Ian M. Asaff" <ian.asaff@...> 2011/11/19

did you type "irb" first to bring up the ruby command prompt?

[#391154] Re: Newbie - cmd question — "Hussain A." <hahmad@...> 2011/12/12

Hi all,

[#391165] Re: Newbie - cmd question — Luis Lavena <luislavena@...> 2011/12/12

Hussain A. wrote in post #1036281:

[#390374] Principle of Best Principles — Intransition <transfire@...>

I seem to run into a couple of design issue a lot and I never know what is

16 messages 2011/11/20

[#390396] how to call Function argument into another ruby script. — hari mahesh <harismahesh@...>

Consider I have a ruby file called library.rb.

10 messages 2011/11/21

[#390496] How to make 1.9.2 my default version using RVM — Fily Salas <fs_tigre@...>

Hi,

25 messages 2011/11/24

[#390535] Is high-speed sorting impossible with Ruby? — "Gaurav C." <chande.gaurav@...>

Well, first of all, I'm new to Ruby, and to this forum. So, hello. :)

39 messages 2011/11/25
[#390580] Re: Is high-speed sorting impossible with Ruby? — Joao Pedrosa <joaopedrosa@...> 2011/11/27

Hi,

[#390593] Re: Is high-speed sorting impossible with Ruby? — "Gaurav C." <chande.gaurav@...> 2011/11/27

Joao Pedrosa wrote in post #1033884:

[#390600] Re: Is high-speed sorting impossible with Ruby? — Douglas Seifert <doug@...> 2011/11/27

A big gain can be had by disabling the garbage collector. Here is my best

[#390601] Re: Is high-speed sorting impossible with Ruby? — Douglas Seifert <doug@...> 2011/11/27

I've thrown various solutions up on github here:

[#390650] Loading a faulty ruby file - forcing this — Marc Heiler <shevegen@...>

Hi.

10 messages 2011/11/29

[#390689] Stupid question — James Gallagher <lollyproductions@...>

Hi everyone.

22 messages 2011/11/30

Building a data structure - Hashes of Hashes of Hashes of Arrays

From: Sebastian YEPES <sebastian@...>
Date: 2011-11-08 11:07:37 UTC
List: ruby-talk #389862
Good morning everyone,

This week at work I had the challenge of parsing a specific file format
that contains IP ranges categorized by different Sites, Areas and
Regions.
Basically I needed a script to load all this location information into a
data structure that would allow me an easy way of obtaining all the IPs
of sites, areas or regions for a later transformation.

Required data structure:
 data[Region][Area][Site] -> IPs
       Hash   Hash  Hash   Array

I would like to know if the function =E2=80=9CprocessLocations=E2=80=9D c=
ould be
optimized or if there exists a simpler way of achieving the desired data
structure.


Current working copy:
-------------------------------------------------------
require 'pp'

# Function that processes the content of the locations file and returns
the following structure:
#
# data[Region][Area][Site] -> IPs
#       Hash   Hash  Hash   Array
#
def processLocations (lines)
  sites =3D Hash.new{|h, k| h[k] =3D []} # HashOFArray
  area =3D Hash.new{|h,k| h[k]=3DHash.new(&h.default_proc)} # HashOFHash
  region =3D Hash.new{|h,k| h[k]=3DHash.new(&h.default_proc)} # HashOFHas=
h

  lines.each do |line|
    next if lines =3D~ /^#.*/

    # Process IPs range section
    if line =3D~ /(.*)=3D([\d|\-|\.]+)/
      #puts "IP: #{$1} - #{$2}"
      sites[$1.chomp.capitalize] << $2
    end

    # Process area section
    if line =3D~ /(.*)\.area=3D(.*)/i
      #puts "Area: #{$1} - #{$2}"
      if sites.has_key?($1.chomp.capitalize)
        #puts "A: #{$2.chomp.capitalize} - #{$1.chomp.capitalize} -
#{sites.class} - #{sites.keys} - #{sites[$1.chomp.capitalize].class}"

        if (area.has_key?($2.chomp.capitalize) &
area[$2.chomp.capitalize].has_key?($1.chomp.capitalize))
          # The hash exists
          #puts "Adding to an existing hash key more IPs elements to the
array"
          area[$2.chomp.capitalize][$1.chomp.capitalize] <<
sites[$1.chomp.capitalize]
       else
          # The hash does not exist
          #puts "Adding new hash key with new array"
          area[$2.chomp.capitalize][$1.chomp.capitalize] =3D
sites[$1.chomp.capitalize]
        end

        # Clean site hash
        sites =3D Hash.new{|h, k| h[k] =3D []} # HashOFArray
      end
    end

    # Process region section
    if line =3D~ /(.*)\.region=3D(.*)/i
      #puts "Region: #{$1} - #{$2}"
      if area.has_key?($1.chomp.capitalize)
        #puts "R: #{$2.chomp.capitalize} - #{$1.chomp.capitalize} -
#{area.class} - #{area.keys} - #{area[$1.chomp.capitalize].class} -
#{area[$1.chomp.capitalize].keys}"
        tmp =3D Hash.new
        tmp =3D area.dup

        region[$2.chomp.capitalize][$1.chomp.capitalize] =3D
tmp[$1.chomp.capitalize]
      end
    end
  end
  return region
end

##############
#  MAIN

f =3D File.open(DATA)
 lines =3D f.readlines
f.close
data =3D processLocations(lines)

puts "+data---------------------------------------------------------"
pp data

puts "+data['Asia']-------------------------------------------------"
pp data['Asia']

puts "+data['Asia']['Australia']------------------------------------"
pp data['Asia']['Australia']

puts "+data['Europe-middle east-africa']['France']['Paris']---------"
pp data['Europe-middle east-africa']['France']['Paris']


__END__
Alexandria (ALH)=3D192.168.6.0-192.168.6.127
Alexandria (ALH).area=3DAustralia
Australia.region=3DAsia

Altona=3D192.168.1.192-192.168.1.255
Altona=3D192.168.2.192-192.168.2.255
Altona.area=3DAustralia

TOKYO VPN=3D192.168.3.192-192.168.3.255
TOKYO VPN.area=3DJAPAN
JAPAN.region=3DAsia

Paris=3D192.168.4.192-192.168.4.255
Paris.area=3DFrance

Rennes=3D192.168.5.192-192.168.5.255
Rennes.area=3DFrance
France.region=3DEUROPE-MIDDLE EAST-AFRICA
-------------------------------------------------------


Example output:

# ruby ruby_help.rb
+data---------------------------------------------------------
{"Asia"=3D>
  {"Australia"=3D>
    {"Alexandria (alh)"=3D>["192.168.6.0-192.168.6.127"],
     "Altona"=3D>["192.168.1.192-192.168.1.255",
"192.168.2.192-192.168.2.255"]},
   "Japan"=3D>{"Tokyo vpn"=3D>["192.168.3.192-192.168.3.255"]}},
 "Europe-middle east-africa"=3D>
  {"France"=3D>
    {"Paris"=3D>["192.168.4.192-192.168.4.255"],
     "Rennes"=3D>["192.168.5.192-192.168.5.255"]}}}
+data['Asia']-------------------------------------------------
{"Australia"=3D>
  {"Alexandria (alh)"=3D>["192.168.6.0-192.168.6.127"],
   "Altona"=3D>["192.168.1.192-192.168.1.255",
"192.168.2.192-192.168.2.255"]},
 "Japan"=3D>{"Tokyo vpn"=3D>["192.168.3.192-192.168.3.255"]}}
+data['Asia']['Australia']------------------------------------
{"Alexandria (alh)"=3D>["192.168.6.0-192.168.6.127"],
 "Altona"=3D>["192.168.1.192-192.168.1.255",
"192.168.2.192-192.168.2.255"]}
+data['Europe-middle east-africa']['France']['Paris']---------
["192.168.4.192-192.168.4.255"]
-------------------------------------------------------



Regards and thanks in advance for any suggestions,
Sebastian YEPES

-- =

Posted via http://www.ruby-forum.com/.=

In This Thread

Prev Next