#!/usr/bin/env ruby require 'set' # Initialize variables operation = :union complement = false files = [] # Process options while arg = ARGV.shift if arg.start_with?('-') case arg when '-c' complement = true when '-d' operation = :difference when '-i' operation = :intersection when '-u' operation = :union else puts "Invalid option: #{arg}" puts "usage: [options] file ..." puts "options" puts " -c complement" puts " -d difference" puts " -i intersection" puts " -u union" exit 1 end else files << arg end end # Ensure at least one file is provided if files.empty? puts "No files provided." exit 1 end # Read files into sets sets = [] files.each do |filename| begin lines = File.readlines(filename).map(&:chomp) sets << Set.new(lines) rescue Errno::ENOENT puts "File not found: #{filename}" exit 1 end end # Compute the universe (union of all sets) universe = sets.reduce(Set.new, :|) # Compute result_set based on the operation case operation when :union result_set = sets.reduce(Set.new, :|) when :intersection result_set = sets.reduce { |a, b| a & b } when :difference # Subtract all subsequent sets from the first set result_set = sets[0].dup sets[1..-1].each do |s| result_set -= s end end # Apply complement if specified if complement result_set = universe - result_set end # Output the result result_set.each do |line| puts line end