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.
 

5.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))
  (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

  (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)
    (/ A (expt 2 (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)
    (let ((out-c (mod (combo c) 8)))
      (print out-c)
      (if so (setq so (concat so (format ",%d" out-c)))
	(setq so (format "%d" out-c))
	)))

  (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)))
    so
    )

					  ;boot
  (exec proggo)
  stack-trace
0 1 0 7 (jnz 0)
0 1 0 6 (out 5)
0 1 0 5 (bxc 1)
2 1 0 4 (adv 3)
2 7 0 3 (bxl 6)
2 7 21 2 (cdv 5)
2 2 21 1 (bxl 5)
2 19 21 0 (bst 4)
2 19 21 7 (jnz 0)
2 19 21 6 (out 5)
2 6 21 5 (bxc 1)
21 6 21 4 (adv 3)
21 0 21 3 (bxl 6)
21 0 10 2 (cdv 5)
21 5 10 1 (bxl 5)
21 8 10 0 (bst 4)
21 8 10 7 (jnz 0)
21 8 10 6 (out 5)
21 2 10 5 (bxc 1)
169 2 10 4 (adv 3)
169 4 10 3 (bxl 6)
169 4 10 2 (cdv 5)
169 1 10 1 (bxl 5)
169 11 10 0 (bst 4)
169 11 10 7 (jnz 0)
169 11 10 6 (out 5)
169 1 10 5 (bxc 1)
1354 1 10 4 (adv 3)
1354 7 10 3 (bxl 6)
1354 7 677 2 (cdv 5)
1354 2 677 1 (bxl 5)
1354 679 677 0 (bst 4)
1354 679 677 7 (jnz 0)
1354 679 677 6 (out 5)
1354 2 677 5 (bxc 1)
10833 2 677 4 (adv 3)
10833 4 677 3 (bxl 6)
10833 4 86669 2 (cdv 5)
10833 1 86669 1 (bxl 5)
10833 86667 86669 0 (bst 4)
10833 86667 86669 7 (jnz 0)
10833 86667 86669 6 (out 5)
10833 6 86669 5 (bxc 1)
86669 6 86669 4 (adv 3)
86669 0 86669 3 (bxl 6)
86669 0 21667 2 (cdv 5)
86669 5 21667 1 (bxl 5)
86669 21664 21667 0 (bst 4)
86669 21664 21667 7 (jnz 0)
86669 21664 21667 6 (out 5)
86669 3 21667 5 (bxc 1)
693352 3 21667 4 (adv 3)
693352 5 21667 3 (bxl 6)
693352 5 86669 2 (cdv 5)
693352 0 86669 1 (bxl 5)
693352 86669 86669 0 (bst 4)
693352 86669 86669 7 (jnz 0)
693352 86669 86669 6 (out 5)
693352 0 86669 5 (bxc 1)
5546819 0 86669 4 (adv 3)
5546819 6 86669 3 (bxl 6)
5546819 6 22187278 2 (cdv 5)
5546819 3 22187278 1 (bxl 5)
5546819 22187273 22187278 0 (bst 4)
5546819 22187273 22187278 7 (jnz 0)
5546819 22187273 22187278 6 (out 5)
5546819 7 22187278 5 (bxc 1)
44374556 7 22187278 4 (adv 3)
44374556 1 22187278 3 (bxl 6)
44374556 1 0 2 (cdv 5)
44374556 4 0 1 (bxl 5)
44374556 0 0 0 (bst 4)
  stack-trace

1

44374556 nil 0 2 (cdv 5)
44374556 4 0 1 (bxl 5)
44374556 0 0 0 (bst 4)

so "1,0,4,6,7,3,5,2,1,0" (setq A 739) (combo 4) (adv 1) (/ A (expt 2 (combo 5))) stack-trace ((0 0 0 2 (jnz 0)) (0 0 0 1 (out 4)) (1 0 0 0 (adv 1)) (1 0 0 2 (jnz 0)) (1 0 0 1 (out 4)) (2 0 0 0 (adv 1)) (2 0 0 2 (jnz 0)) (2 0 0 1 (out 4)) (5 0 0 0 (adv 1)) (5 0 0 2 (jnz 0)) (5 0 0 1 (out 4)) (11 0 0 0 (adv 1)) …) so "1,1,1,1,1,1,1,1,1,1"