aboutsummaryrefslogtreecommitdiffstats
path: root/AoC2022/10/solver.el
blob: 5a8b6f868eef9a1a4f21812a2649e1ffdbb99d6c (plain)
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
;;; solver.el --- Day 10 -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2022 Óscar Nájera
;;
;; Author: Óscar Nájera <hi@oscarnajera.com>
;; Maintainer: Óscar Nájera <hi@oscarnajera.com>
;; Created: December 10, 2022
;; Modified: December 10, 2022
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;;  Day 10
;;
;;; Code:

(require 'f)
(require 'subr-x)
(require 'cl-lib)
(require 'ert)

(defsubst solver-probe (cycle register)
  (when (memq cycle '(20 60 100 140 180 220))
    (* cycle register)))

(let ((register 1)
      (cycle 1)
      measures)
  (dolist (instruction (split-string (f-read "input") "\n"))
    (cl-incf cycle)
    (let ((step1 (solver-probe cycle register)) ;; the noop default
          (step2                                ;; addx takes 2 cycles
           (when (string-prefix-p "addx" instruction)
             (cl-incf cycle)
             (cl-incf register (string-to-number (cadr (split-string instruction))))
             (solver-probe cycle register))))
      (when-let ((probe (or step1 step2)))
        (push probe measures))))
  (list (reverse measures)
        (apply #'+ measures)
        cycle))





(provide 'solver)
;;; solver.el ends here