Convert an array into the inverse statement

DYNAMIC_TYPE_CHARTS = 2 => {
       1->    :NORMAL => {
              :Weaknesses     => [:GHOST],
                :Resistances    => [:ICE],
                :Immunities     => []
            },
        2->    :FIRE => {
                :Weaknesses     => [:GHOST],
                :Resistances    => [:ICE],
                :Immunities     => []
            },
         3->   :WATER => {
                :Weaknesses     => [:GHOST],
                :Resistances    => [:ICE],
                :Immunities     => []
    },
         4->  :GRASS => {
                :Weaknesses     => [:GHOST],
                :Resistances    => [:ICE],
                :Immunities     => []
            }
       }

Take the above example array and convert into an arrary like

Strengths_Weak=
1->:GHOST => {
              :Strengths     => [:NORMAL,:FIRE,:WATER,:GRASS]
                :Weak   => [],
                :Immunities     => []
            },
   2->         :ICE => {
                :Strengths     => [],
                :Weak    => [:NORMAL,:WATER,:FIRE,:GRASS,],
                :Immunities     => []
            },
    3->        :WATER => {
                :Strengths     => [],
                :Weak    => [],
                :Immunities     => []
    },
      4->    :GRASS => {
                :Strengths     => [],
                :Weak    => [],
                :Immunities     => []
            }
       }

I actually want to convert from Strengths_Weaknesses to Dynamic_Type_Chart with an example which is a lot more complicated - 16 types with each one having 6 Strengths and Weaks.