m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/21/a.lua
blob: 96ad83c9ec1407e331a19aafb6b68a2e088e489a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
candidates = {}
appearances = {}

function intersect(t1, t2)
    t = {}
    for k, _ in pairs(t1) do
        if t2[k] then
            t[k] = true
        end
    end

    return t
end

for line in io.lines('input.txt') do
    allergens_index = line:find('(', 1, true)
    ingredients = {}
    for ingredient in line:sub(1, allergens_index-2):gmatch("%a+") do
        ingredients[ingredient] = true
        if not appearances[ingredient] then
            appearances[ingredient] = 0
        end
        appearances[ingredient] = appearances[ingredient] + 1
    end

    for allergen in line:sub(allergens_index+10, -2):gmatch("%a+") do
        if not candidates[allergen] then
            candidates[allergen] = ingredients
        else
            candidates[allergen] = intersect(candidates[allergen], ingredients)
        end
    end
end

unsafe = {}
for _, ingredients in pairs(candidates) do
    for ingredient in pairs(ingredients) do
        unsafe[ingredient] = true
    end
end

count = 0

for ingredient, appearances in pairs(appearances) do
    if not unsafe[ingredient] then
        count = count + appearances
    end
end

print(count)