Advent of code 2015 solutions https://adventofcode.com/2015/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

19.py 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/python
  2. from collections import defaultdict
  3. import re
  4. subs = defaultdict(list)
  5. with open('19.txt', 'r') as f:
  6. lines = f.read().splitlines()
  7. gen = set()
  8. long = lines[-1]
  9. for search, replace in [line.split(' => ') for line in lines[0:-2]]:
  10. for start, end in [(i.start(), i.end()) for i in re.finditer(search, long)]:
  11. gen.add(long[0:start] + replace + long[end:])
  12. print(len(gen))
  13. # --- This is ugly as sin, and I've no idea why it seems to work. ¯\_(ツ)_/¯
  14. with open('19.txt', 'r') as f:
  15. lines = f.read().splitlines()
  16. long = lines[-1]
  17. for search, replace in [line.split(' => ') for line in lines[0:-2]]:
  18. subs[search].append(replace)
  19. results = set([long])
  20. previous = set([long])
  21. step = 0
  22. while True:
  23. step += 1
  24. new_results = set()
  25. for candidate in results:
  26. for search, replacements in subs.iteritems():
  27. for replacement in replacements:
  28. for start, end in [(i.start(), i.end()) for i in re.finditer(replacement, candidate)]:
  29. r = candidate[0:start] + search + candidate[end:]
  30. if r not in previous:
  31. new_results.add(r)
  32. previous.add(r)
  33. shortest = min(len(x) for x in new_results)
  34. new_results = set(list({r for r in new_results if len(r) == shortest})[:1])
  35. print("%s (%s)" % (step, len(new_results)))
  36. if 'e' in new_results:
  37. print("*** %s" % step)
  38. break
  39. results = new_results