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.
2.8 KiB
2.8 KiB
solution to p17
Load program
(require 'dash)
(defun replace-regexp-from-top (a b)
(goto-char (point-min))
(replace-regexp a b))
(with-temp-buffer
(insert-file-contents "input")
(replace-regexp-from-top "Register \\(.\\): \\(.*\\)$" "(setq \\1 \\2)")
(replace-regexp-from-top "\\(.\\),\\(.\\)" "(\\1 \\2)")
(replace-regexp-from-top "," " ")
(replace-regexp-from-top "Program: \\(.*\\)$" "(setq program '(\\1))")
(eval-buffer))
Convert the opcodes into instructions
(let ((opcode-alist '( (0 . adv)
(1 . bxl)
(2 . bst)
(3 . jnz)
(4 . bxc)
(5 . out)
(6 . bdv)
(7 . cdv))))
(setq proggo (--map (cons (cdr (assoc (car it) opcode-alist)) (cdr it)) program)))
| bst | 4 |
| bxl | 5 |
| cdv | 5 |
| bxl | 6 |
| adv | 3 |
| bxc | 1 |
| out | 5 |
| jnz | 0 |
Now define the instructions and run, for part 1
(defun combo (c)
(let ((combo-alist `( (4 . ,A)
(5 . ,B)
(6 . ,C))))
(if (< c 4) c
(cdr (assoc c combo-alist)))))
(defun aux-adv (c)
(ash A (* -1 (combo c))))
(defun adv (c)
(setq A (aux-adv c)))
(defun bdv (c)
(setq B (aux-adv c)))
(defun cdv (c)
(setq C (aux-adv c)))
(defun bxl (l)
(setq B (logxor l B)))
(defun bst (c)
(setq B (mod (combo c) 8)))
(defun out (c)
(push (mod (combo c) 8) so))
(defun bxc (l)
(setq B (logxor B C))
)
(defun jnz (l)
(unless (eq A 0)
(setq ip (- (/ l 2) 1))))
(defun exec (pr)
(setq so nil
ip 0
stack-trace nil)
(while (nth ip pr)
(push (list A B C ip (nth ip pr)) stack-trace)
(eval (nth ip pr))
(setq ip (1+ ip)))
(substring (apply #'concat (-map (-partial #'format "%d,") (reverse so))) 0 -1))
(exec proggo)
1,5,0,3,7,3,0,3,1
now for part 2 we create the initial value 3 bits at a time
(defun prep-reg (data)
(apply #'+ (--map-indexed (ash it (* 3 it-index)) data)) )
(defun setup-registers (data)
(setq A (prep-reg data)
B 0
C 0))
(defun exec (pr data)
(let ((so nil)
(ip 0)
(stack-trace nil))
(setup-registers data)
(while (nth ip pr)
(eval (nth ip pr))
(setq ip (1+ ip)))
(reverse so)))
(setq data (list nil)
target (-flatten program))
(defun grow-data (data)
(--mapcat (-map (lambda (i) (append it (list i))) (-iota 8)) data)
)
(defun good-data (data)
(--filter (-is-prefix-p (exec proggo it) target) ) (grow-data data))
(-iterate #'good-data data (length target))
(good-data '((1)))
(exec proggo '(1 2))
target