Code for the Advent of Code event
aoc advent-of-code
at rust 26 lines 837 B view raw
1#!/usr/bin/env ruby 2# frozen_string_literal: true 3 4FOODS = ARGF.readlines.map do |f| 5 f =~ /((?:\w+ ?)+)\(contains ((?:\w+(?:, )?)+)\)/ 6 [$1.split, $2.split(?,)].map { |v| v.map { _1.strip.to_sym } } 7end 8 9ALL_INGREDIENTS = FOODS.flat_map(&:first) 10INGREDIENTS = ALL_INGREDIENTS.to_set 11ALLERGENS = FOODS.flat_map { _2 }.to_set 12 13ALLERGEN_INGREDIENTS = ALLERGENS.to_h do |a| 14 [a, FOODS.select { _2.include? a }.map(&:first).reduce(:intersection)] 15end 16 17puts (ALL_INGREDIENTS - ALLERGEN_INGREDIENTS.values.flatten).size 18 19while ALLERGEN_INGREDIENTS.values.any? { _1.count > 1 } 20 singles = ALLERGEN_INGREDIENTS.values.select { _1.count == 1 }.flatten.to_set 21 ALLERGEN_INGREDIENTS.values.select { _1.count > 1 }.each do |v| 22 v.reject! { singles.include? _1 } 23 end 24end 25 26puts ALLERGEN_INGREDIENTS.sort_by(&:first).map { _2.first }.join ?,