From 9919db188749702bc2b096089ea6c11d39b9be23 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Mon, 21 Dec 2020 08:51:45 -0800 Subject: [PATCH] [2020][ruby][21.1] --- 2020/ruby/day_21.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 2020/ruby/day_21.rb diff --git a/2020/ruby/day_21.rb b/2020/ruby/day_21.rb new file mode 100644 index 0000000..0e82d40 --- /dev/null +++ b/2020/ruby/day_21.rb @@ -0,0 +1,26 @@ +require "set" + +Food = Struct.new(:id, :ingredients, :allergens) + +foods = ARGF.read + .scan(/(.+) \(contains (.+)\)/) + .map.with_index {|(ingredients, allergens), i| + ingredients, allergens = [ ingredients.split(" "), allergens.split(", ") ].map {|x| Set.new(x) } + Food.new(i, ingredients, allergens) + } + +all_ingredients = foods.map(&:ingredients).inject(&:|) + +no_allergens = all_ingredients.select {|ingredient| + possible_allergens = foods + .select {|food| food.ingredients.include?(ingredient) } + .map(&:allergens) + .inject(&:|) + possible_allergens.none? {|allergen| + foods_with_allergen = foods.select {|f| f.allergens.include?(allergen) } + foods_with_allergen.all? {|f| f.ingredients.include?(ingredient) } + } +} + +p foods.map {|f| f.ingredients.count {|i| no_allergens.include?(i) }}.sum +