states = ["alabama","alaska","arizona","arkansas","california","colorado",
"connecticut","delaware","florida","georgia","hawaii","idaho",
"illinois","indiana","iowa","kansas","kentucky","louisiana",
"maine","maryland","massachusetts","michigan","minnesota",
"mississippi","missouri","montana","nebraska","nevada",
"newhampshire","newjersey","newmexico","newyork","northcarolina",
"northdakota","ohio","oklahoma","oregon","pennsylvania","rhodeisland",
"southcarolina","southdakota","tennessee","texas","utah","vermont",
"virginia","washington","westvirginia","wisconsin","wyoming"]
module Enumerable
def unique_combinations
a = dup
result = []
length.times { el1 = a.shift; a.each { |el2| result << [el1, el2] } }
result
end
def normalize_and_cluster
dict = {}
each { |el| (dict[ yield(el) ] ||= []) << el }
dict
end
end
states.unique_combinations.normalize_and_cluster { |state1, state2| (state1 + state2).split(//).sort }.each { |k, v| puts "#{v[0].join(' + ')} = #{v[1].join(' + ')}" if v.length > 1 }
# >> northcarolina + southdakota = northdakota + southcarolina