Code for the Advent of Code event
aoc
advent-of-code
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 ?,