Merge branch 'main' of https://git.trwnh.com/a/aoc
This commit is contained in:
commit
4960ab9dfe
|
@ -1,16 +1,58 @@
|
||||||
def main():
|
def main():
|
||||||
with open("input_sample.txt") as f:
|
with open("input.txt") as f:
|
||||||
lines = f.read().split('\n')
|
lines = f.read().split('\n')
|
||||||
|
foods = [s[:-1].split(' (contains ') for s in lines]
|
||||||
|
# map allergens to possible ingredients
|
||||||
|
possible = [
|
||||||
|
(allergen, set(food[0].split(' ')))
|
||||||
|
for food in foods
|
||||||
|
for allergen in food[1].split(', ')
|
||||||
|
]
|
||||||
|
# get sets of all allergens and all ingredients
|
||||||
|
allergens = {p[0] for p in possible}
|
||||||
|
ingredients = set.union(*[p[1] for p in possible])
|
||||||
|
# find which ingredients are always listed for a given allergen
|
||||||
|
possible = {
|
||||||
|
a:set.intersection(*[
|
||||||
|
s[1]
|
||||||
|
for s in possible
|
||||||
|
if s[0] == a]
|
||||||
|
) for a in allergens
|
||||||
|
}
|
||||||
|
# reduce
|
||||||
|
while any({i for i in possible if len(possible[i]) > 1}):
|
||||||
|
for b in {j for j in possible if len(possible[j]) > 1}:
|
||||||
|
for a in {i for i in possible if len(possible[i]) == 1}:
|
||||||
|
possible[b] -= possible[a]
|
||||||
|
# find sets of allergenic and non-allergenic
|
||||||
|
unsafe = set.union(*list(possible.values()))
|
||||||
|
safe = ingredients - unsafe
|
||||||
|
#
|
||||||
|
print('|non-allergen occurrences| =', sum(
|
||||||
|
food[0].split().count(s)
|
||||||
|
for food in foods
|
||||||
|
for s in safe)
|
||||||
|
)
|
||||||
|
print('allergens:', ','.join(
|
||||||
|
[
|
||||||
|
list(possible[a])[0]
|
||||||
|
for a in sorted(list(possible))
|
||||||
|
])
|
||||||
|
)
|
||||||
|
|
||||||
|
"""
|
||||||
all_ingredients = set()
|
all_ingredients = set()
|
||||||
all_allergens = set()
|
all_allergens = set()
|
||||||
may_contain = {}
|
may_contain = {}
|
||||||
unsafe_ingredients = {}
|
unsafe_ingredients = {}
|
||||||
|
foods = []
|
||||||
for line in lines:
|
for line in lines:
|
||||||
ingredients, contains = line.split(' (contains ')
|
ingredients, contains = line.split(' (contains ')
|
||||||
ingredients = ingredients.split(' ')
|
ingredients = ingredients.split(' ')
|
||||||
contains = contains[:-1].split(', ') # remove trailing ")" then split
|
contains = contains[:-1].split(', ') # remove trailing ")" then split
|
||||||
all_ingredients = all_ingredients | set(ingredients)
|
all_ingredients = all_ingredients | set(ingredients)
|
||||||
all_allergens = all_allergens | set(contains)
|
all_allergens = all_allergens | set(contains)
|
||||||
|
"""
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
22
2020/25/25.py
Normal file
22
2020/25/25.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
pubkey1 = 3418282
|
||||||
|
pubkey2 = 8719412
|
||||||
|
|
||||||
|
subject = 7
|
||||||
|
mod = 20201227
|
||||||
|
|
||||||
|
loop1 = 0
|
||||||
|
value1 = 1
|
||||||
|
while value1 != pubkey1:
|
||||||
|
value1 = (value1 * subject) % mod
|
||||||
|
loop1 += 1
|
||||||
|
|
||||||
|
loop2 = 0
|
||||||
|
value2 = 1
|
||||||
|
while value2 != pubkey2:
|
||||||
|
value2 = (value2 * subject) % mod
|
||||||
|
loop2 += 1
|
||||||
|
|
||||||
|
enckey1 = pow(pubkey2,loop1,mod)
|
||||||
|
enckey2 = pow(pubkey1,loop2,mod)
|
||||||
|
assert enckey1 == enckey2
|
||||||
|
print(enckey1)
|
2
2020/25/input.txt
Normal file
2
2020/25/input.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
3418282
|
||||||
|
8719412
|
Loading…
Reference in a new issue