Browse Source

Day 25

master
Chris Smith 7 years ago
parent
commit
e357fe748e
2 changed files with 123 additions and 0 deletions
  1. 93
    0
      25.py
  2. 30
    0
      data/25.txt

+ 93
- 0
25.py View File

@@ -0,0 +1,93 @@
1
+#!/usr/bin/python3
2
+
3
+"""Solution for day 25 of Advent of Code 2016.
4
+
5
+This is a copy of Day 23's solution, with an 'out' instruction added.
6
+
7
+Manual testing showed the output repeats regularly, so we just run the program until there are 20 bits output.
8
+"""
9
+import itertools
10
+
11
+
12
+def value(registers, x):
13
+    try:
14
+        return int(x)
15
+    except ValueError:
16
+        return registers[x]
17
+
18
+
19
+def cpy(registers, src, dst):
20
+    registers[dst] = value(registers, src)
21
+
22
+
23
+def inc(registers, reg):
24
+    registers[reg] += 1
25
+
26
+
27
+def dec(registers, reg):
28
+    registers[reg] -= 1
29
+
30
+
31
+def jnz(registers, val, tar):
32
+    registers['pc'] += 0 if value(registers, val) == 0 else value(registers, tar) - 1
33
+
34
+
35
+def tgl(registers, ins):
36
+    mappings = {inc: dec, dec: inc, tgl: inc, jnz: cpy, cpy: jnz}
37
+    target = registers['pc'] + value(registers, ins)
38
+    registers['in'][target] = (mappings[registers['in'][target][0]], registers['in'][target][1])
39
+
40
+
41
+def out(registers, val):
42
+    registers['out'].append(value(registers, val))
43
+
44
+
45
+def try_multiply(registers):
46
+    try:
47
+        pc = registers['pc']
48
+        chunk = registers['in'][pc:pc+6]
49
+        instr, args = map(list, zip(*chunk))
50
+        if instr == [cpy, inc, dec, jnz, dec, jnz] \
51
+                and args[0][1] == args[2][0] == args[3][0] \
52
+                and args[4][0] == args[5][0] \
53
+                and args[1][0] != args[0][1] != args[4][0] != args[0][0] \
54
+                and args[3][1] == '-2' and args[5][1] == '-5':
55
+            registers[args[1][0]] += value(registers, args[0][0]) * value(registers, args[4][0])
56
+            registers[args[2][0]] = 0
57
+            registers[args[4][0]] = 0
58
+            registers['pc'] += 5
59
+            return True
60
+    except:
61
+        pass
62
+    return False
63
+
64
+
65
+def step(registers):
66
+    if not try_multiply(registers):
67
+        try:
68
+            registers['in'][registers['pc']][0](registers, *registers['in'][registers['pc']][1])
69
+        except:
70
+            pass
71
+
72
+
73
+def run(values):
74
+    registers = values
75
+    registers['pc'] = 0
76
+    registers['out'] = []
77
+    registers['in'] = instr.copy()
78
+
79
+    while registers['pc'] < len(instr) and len(registers['out']) < 20:
80
+        step(registers)
81
+        registers['pc'] += 1
82
+
83
+    return registers['out']
84
+
85
+
86
+with open('data/25.txt', 'r') as file:
87
+    instr = map(str.split, map(str.strip, file.readlines()))
88
+    instr = [(globals()[i[0]], i[1:]) for i in instr]
89
+
90
+for a in itertools.count():
91
+    if run({'a': a, 'b': 0, 'c': 0, 'd': 0}) == [0, 1] * 10:
92
+        print('Part one: %s' % a)
93
+        break

+ 30
- 0
data/25.txt View File

@@ -0,0 +1,30 @@
1
+cpy a d
2
+cpy 7 c
3
+cpy 365 b
4
+inc d
5
+dec b
6
+jnz b -2
7
+dec c
8
+jnz c -5
9
+cpy d a
10
+jnz 0 0
11
+cpy a b
12
+cpy 0 a
13
+cpy 2 c
14
+jnz b 2
15
+jnz 1 6
16
+dec b
17
+dec c
18
+jnz c -4
19
+inc a
20
+jnz 1 -7
21
+cpy 2 b
22
+jnz c 2
23
+jnz 1 4
24
+dec b
25
+dec c
26
+jnz 1 -4
27
+jnz 0 0
28
+out b
29
+jnz a -19
30
+jnz 1 -21

Loading…
Cancel
Save