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