-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday-09.lisp
145 lines (136 loc) · 5.98 KB
/
day-09.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
;;;; Advent of code day 9
(in-package #:aoc2019)
(defparameter *input-day-09* #(1102 34463338 34463338 63 1007 63
34463338 63 1005 63 53 1102 3 1 1000 109 988 209 12 9 1000 209 6 209 3
203 0 1008 1000 1 63 1005 63 65 1008 1000 2 63 1005 63 904 1008 1000 0
63 1005 63 58 4 25 104 0 99 4 0 104 0 99 4 17 104 0 99 0 0 1102 1 21
1008 1101 427 0 1028 1102 23 1 1012 1101 32 0 1009 1101 37 0 1007 1102
1 892 1023 1102 27 1 1004 1102 1 38 1013 1102 1 20 1005 1101 0 29 1001
1101 0 22 1015 1102 1 35 1003 1101 0 39 1016 1102 34 1 1011 1101 899 0
1022 1102 195 1 1024 1101 36 0 1014 1101 0 24 1000 1102 1 31 1006 1101
0 28 1017 1101 422 0 1029 1102 1 33 1019 1102 1 26 1018 1102 1 0 1020
1102 25 1 1002 1102 712 1 1027 1101 0 190 1025 1101 0 715 1026 1102 1
1 1021 1101 30 0 1010 109 30 2105 1 -6 4 187 1106 0 199 1001 64 1 64
1002 64 2 64 109 -19 1206 10 211 1106 0 217 4 205 1001 64 1 64 1002 64
2 64 109 -13 1202 8 1 63 1008 63 28 63 1005 63 241 1001 64 1 64 1106 0
243 4 223 1002 64 2 64 109 8 1201 -2 0 63 1008 63 29 63 1005 63 263
1105 1 269 4 249 1001 64 1 64 1002 64 2 64 109 -9 2101 0 3 63 1008 63
24 63 1005 63 295 4 275 1001 64 1 64 1106 0 295 1002 64 2 64 109 12
2107 31 0 63 1005 63 317 4 301 1001 64 1 64 1106 0 317 1002 64 2 64
109 7 21101 40 0 0 1008 1016 43 63 1005 63 341 1001 64 1 64 1106 0 343
4 323 1002 64 2 64 109 -14 1208 -1 31 63 1005 63 363 1001 64 1 64 1106
0 365 4 349 1002 64 2 64 109 9 1208 -6 20 63 1005 63 387 4 371 1001 64
1 64 1105 1 387 1002 64 2 64 109 2 2102 1 -7 63 1008 63 31 63 1005 63
413 4 393 1001 64 1 64 1106 0 413 1002 64 2 64 109 21 2106 0 -6 4 419
1106 0 431 1001 64 1 64 1002 64 2 64 109 -25 2108 35 -6 63 1005 63 449
4 437 1106 0 453 1001 64 1 64 1002 64 2 64 109 3 21107 41 42 0 1005
1012 471 4 459 1105 1 475 1001 64 1 64 1002 64 2 64 109 7 21108 42 39
-2 1005 1017 495 1001 64 1 64 1105 1 497 4 481 1002 64 2 64 109 -8
1206 9 515 4 503 1001 64 1 64 1106 0 515 1002 64 2 64 109 4 1205 6 529
4 521 1105 1 533 1001 64 1 64 1002 64 2 64 109 -8 2107 26 -5 63 1005
63 553 1001 64 1 64 1106 0 555 4 539 1002 64 2 64 109 -6 2102 1 1 63
1008 63 26 63 1005 63 575 1105 1 581 4 561 1001 64 1 64 1002 64 2 64
109 10 2101 0 -8 63 1008 63 37 63 1005 63 601 1105 1 607 4 587 1001 64
1 64 1002 64 2 64 109 -19 1207 8 23 63 1005 63 627 1001 64 1 64 1106 0
629 4 613 1002 64 2 64 109 18 21101 43 0 3 1008 1013 43 63 1005 63 655
4 635 1001 64 1 64 1106 0 655 1002 64 2 64 109 -16 1207 6 25 63 1005
63 677 4 661 1001 64 1 64 1106 0 677 1002 64 2 64 109 25 21102 44 1 -4
1008 1015 44 63 1005 63 703 4 683 1001 64 1 64 1106 0 703 1002 64 2 64
109 17 2106 0 -9 1106 0 721 4 709 1001 64 1 64 1002 64 2 64 109 -16
1205 0 737 1001 64 1 64 1105 1 739 4 727 1002 64 2 64 109 -12 21107 45
44 5 1005 1013 759 1001 64 1 64 1106 0 761 4 745 1002 64 2 64 109 4
1201 -8 0 63 1008 63 27 63 1005 63 783 4 767 1106 0 787 1001 64 1 64
1002 64 2 64 109 -16 2108 25 4 63 1005 63 803 1105 1 809 4 793 1001 64
1 64 1002 64 2 64 109 27 21102 46 1 -5 1008 1018 43 63 1005 63 829
1106 0 835 4 815 1001 64 1 64 1002 64 2 64 109 -27 1202 8 1 63 1008 63
27 63 1005 63 857 4 841 1105 1 861 1001 64 1 64 1002 64 2 64 109 23
21108 47 47 -2 1005 1017 883 4 867 1001 64 1 64 1106 0 883 1002 64 2
64 109 -1 2105 1 5 1001 64 1 64 1106 0 901 4 889 4 64 99 21102 1 27 1
21102 915 1 0 1105 1 922 21201 1 29589 1 204 1 99 109 3 1207 -2 3 63
1005 63 964 21201 -2 -1 1 21102 1 942 0 1106 0 922 21202 1 1 -1 21201
-2 -3 1 21102 957 1 0 1105 1 922 22201 1 -1 -2 1106 0 968 21202 -2 1
-2 109 -3 2106 0 0))
(defun vector-to-hash (vec)
(let ((hash (make-hash-table)))
(dotimes (i (length vec) hash)
(setf (gethash i hash)
(aref vec i)))))
(defun intcode9 (&key (memory *input-day-09*) input)
(let ((ip 0)
(rp 0)
(output)
(mem (vector-to-hash memory)))
(labels ((ip (n) (+ ip n))
(mem (ip &optional (mod 1))
(ecase mod
(0 (gethash (gethash ip mem 0) mem 0))
(1 (gethash ip mem 0))
(2 (gethash (+ rp (gethash ip mem)) mem 0))))
((setf mem) (val ip &optional (mod 1))
(ecase mod
(0 (setf (gethash (gethash ip mem ) mem) val))
(1 (setf (gethash ip mem) val))
(2 (setf (gethash (+ rp (gethash ip mem)) mem) val))))
(decode-opcode (int)
"ABCDE -> (DE C B A)"
(let ((str (format nil "~5,'0d" int)))
(list (parse-integer str :start 3)
(parse-integer str :start 2 :end 3)
(parse-integer str :start 1 :end 2)
(parse-integer str :start 0 :end 1))))
(gen-opcode (fn mod1 mod2 mod3)
(setf (mem (ip 3) mod3)
(funcall fn (mem (ip 1) mod1)
(mem (ip 2) mod2)))
(ip 4))
(opcode1 (mod1 mod2 mod3)
(gen-opcode #'+ mod1 mod2 mod3))
(opcode2 (mod1 mod2 mod3)
(gen-opcode #'* mod1 mod2 mod3))
(opcode3 (mod1)
(setf (mem (ip 1) mod1) (pop input))
(ip 2))
(opcode4 (mod1)
(ecase mod1
((0 1) (push (mem (ip 1) mod1) output))
(2 (push (mem (ip 1) mod1) output)))
(ip 2))
(opcode5 (mod1 mod2)
(if (zerop (mem (ip 1) mod1))
(ip 3)
(mem (ip 2) mod2)))
(opcode6 (mod1 mod2)
(if (zerop (mem (ip 1) mod1)) (mem (ip 2) mod2) (ip 3)))
(opcode7 (mod1 mod2 mod3)
(gen-opcode #'op< mod1 mod2 mod3))
(opcode8 (mod1 mod2 mod3)
(gen-opcode #'op= mod1 mod2 mod3))
(opcode9 (mod1)
(incf rp (mem (ip 1) mod1))
(ip 2)))
(do ()
(())
(destructuring-bind (opcode mod1 mod2 mod3)
(decode-opcode (mem ip))
(setf ip
(ecase opcode
(1 (opcode1 mod1 mod2 mod3))
(2 (opcode2 mod1 mod2 mod3))
(3 (opcode3 mod1))
(4 (opcode4 mod1))
(5 (opcode5 mod1 mod2))
(6 (opcode6 mod1 mod2))
(7 (opcode7 mod1 mod2 mod3))
(8 (opcode8 mod1 mod2 mod3))
(9 (opcode9 mod1))
(99 (return-from intcode9 (nreverse output))))
))))))
(defun solution-day09-1 ()
(first (intcode9 :input '(1))))
(defun solution-day09-2 ()
(first (intcode9 :input '(2))))
(defun solve-day09 ()
(format t "Answer for puzzle 1 of day 9: ~A~&"
(solution-day09-1))
(format t "Answer for puzzle 2 of day 9: ~A~&"
(solution-day09-2)))