19_medicine.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/usr/bin/env python3
  2. import sys
  3. from random import shuffle
  4. def parse(f):
  5. ltrans, start = f.read().rstrip().split('\n\n')
  6. trans = {}
  7. for line in ltrans.split('\n'):
  8. key, val = line.split(' => ')
  9. trans.setdefault(key, []).append(val)
  10. return trans, start
  11. def replace_one(mol, trans):
  12. for i, c in enumerate(mol):
  13. if c in trans:
  14. for repl in trans[c]:
  15. yield mol[:i] + repl + mol[i + 1:]
  16. elif i < len(mol) - 1:
  17. key = c + mol[i + 1]
  18. if key in trans:
  19. for repl in trans[key]:
  20. yield mol[:i] + repl + mol[i + 2:]
  21. def steps_to_e(target, trans):
  22. revtrans = {val: key for key, vals in trans.items() for val in vals}
  23. keys = list(revtrans)
  24. steps = 0
  25. mol = target
  26. while mol != 'e':
  27. oldsteps = steps
  28. shuffle(keys)
  29. for key in keys:
  30. n = mol.count(key)
  31. if n:
  32. steps += n
  33. mol = mol.replace(key, revtrans[key])
  34. if steps == oldsteps:
  35. steps = 0
  36. mol = target
  37. return steps
  38. # part 1
  39. trans, medicine = parse(sys.stdin)
  40. print(len(set(replace_one(medicine, trans))))
  41. # part 2
  42. print(steps_to_e(medicine, trans))