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.9 KiB

Solution to p10

  (with-temp-buffer
    (insert-file-contents "input")
    (advent/replace-multiple-regex-buffer
     '(("," . " ")
       ("^" . "(")
       ("$" . ")")
       ("\\[" . "\"")
       ("\\]" . "\"")
       ("{" . "(")
       ("}" . ")")
       ))
    (goto-char (point-min))
    (insert "(setq data '(")
    (goto-char (point-max))
    (insert "))")
    (eval-buffer))
  (defun zero-one (n)
    (if (eq n ?#) 1 0))

  (setq cleanedup-data (--map (cons (-map #'zero-one (advent/split-string-into-char-list (car it))) (cdr it)) data))

for part 1 we do not need the last item

  (setq machines (--map (-drop-last 1 it) cleanedup-data))

  (defun to-bin (l)
    (-sum  (--map-indexed (* it (expt 2 it-index)) l)))

  (defun to-mask (l)
    (-sum (--map (expt 2 it) l)))

  (setq mask-machines (--map (cons (to-bin (car it)) (-map #'to-mask (cdr it))) machines))

  (-sum
   (-map (lambda (machine) 
  	 (-min (-map 'length  (--filter (= (car machine) (apply 'logxor it))
  					(-powerset (cdr machine))))))
         mask-machines))
404

This approach blows the stack

  (setq machines (--map (-rotate 1 (cdr it)) data))

  (defun apply-button (joltage button)
    (--map-indexed (if (-contains-p button it-index) (- it 1) it) joltage))

  (defun good-buttons (machine)
    (-filter (lambda (button) (--every (< 0 (nth it (car machine))) button)) (cdr machine)))

  (defun solve-machines (machines)
    (-mapcat (lambda (machine)
  	     (if (= 0 (-sum (car machine))) (list machine)
  	       (--map (cons it (cdr machine)) (--map (apply-button (car machine) it) (good-buttons machine)))))
  	    machines ))

  (-iterate 'solve-machines (list (car machines)) 19)

Instead, go depth first and memoize for the win

  (setq machines (--map (-rotate 1 (cdr it)) data)
        machines (--map (cons (car it) (--sort (> (length it) (length other)) (cdr it))) machines))

  (defun apply-button (joltage button)
    (--map-indexed (if (-contains-p button it-index) (- it 1) it) joltage))

    (defun good-buttons (machine)
      (-filter (lambda (button) (--every (< 0 (nth it (car machine))) button)) (cdr machine)))

    (defun or-min (l)
      (when l (-min l)))

    (defun nil-1+ (l)
      (when l (1+ l)))

    (defun solve-machine (machine)
      (when machine
        (if (= 0 (-sum (car machine))) 0
  	(nil-1+ (solve-machine (-first 'solve-machine (--map (cons it (cdr machine)) (--map (apply-button (car machine) it) (good-buttons machine)))))))))

    (memoize 'solve-machine)
  (let ((a))
  (setq num 0
  	res nil)
  (--each machines (progn (message (format "%d" (setq num (1+ num))))
  			(push (solve-machine it) res)))
  (-sum res))

  (cadr machines)
  (solve-machine (cadr machines))
  (length machines)151
33