#!/usr/bin/env ruby -w require 'yaml' classes = { 'english' => ['Andy', 'Bob', 'Charlie'], 'math' => ['Charlie', 'Paul', 'Frank'], 'physics' => ['Bob', 'Thomas', 'Frank', 'Earl'], 'cs' => ['Thomas', 'Dennis', 'Richard'], 'chem' => ['Earl', 'Gordon'] } graph = {} classes.keys.each do |classname| graph[classname] = [] end classes.each do |classname1, members1| classes.each do |classname2, members2| if classname1 < classname2 intersection = members1 & members2 unless intersection.empty? graph[classname1].push(classname2) graph[classname2].push(classname1) end end end end sets = [] nodes = graph.keys while not nodes.empty? node = nodes.shift set = [node] nodes.each do |n| unless graph[n].include? node set.push n nodes.delete n end end sets.push(set) end sets.each do |set| puts "[#{set.sort.join(', ')}]" end