fork download
  1. require 'set'
  2. f = -> a {
  3. g = -> a {a.combination(2) {|x, y| break g.(a.tap {x.merge y; a.delete y}) if x.intersect? y}}
  4. h = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
  5. a = a.map {|s| s.split('=').map {|k| h[k]}.to_set SortedSet}
  6. g.(a).map {|set| set.map &h.invert.method(:[])}
  7. }
  8. a = ["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
  9. "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
  10. "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"]
  11. p f.(a)
  12.  
Success #stdin #stdout 0.01s 8424KB
stdin
Standard input is empty
stdout
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], ["c1", "c2", "c3", "c4", "d1", "d2", "d3"], ["e1", "e2", "e3"]]