;;; solver.el --- Day 10 -*- lexical-binding: t; -*- ;; ;; Copyright (C) 2022 Óscar Nájera ;; ;; Author: Óscar Nájera ;; Maintainer: Óscar Nájera ;; Created: December 10, 2022 ;; Modified: December 10, 2022 ;; ;; This file is not part of GNU Emacs. ;; ;;; Commentary: ;; ;; Day 10 ;; ;;; Code: (require 'subr-x) (require 'cl-lib) (require 'ert) (defsubst solver-probe (cycle register) (when (memq cycle '(20 60 100 140 180 220)) (* cycle register))) (defsubst solver-draw-pixel (pixel register) (when (= 0 pixel) (insert "\n")) (insert (if (<= (1- register) pixel (1+ register)) "#" "."))) (defun solver-instructions (filename) (with-temp-buffer (insert-file-contents filename) (split-string (buffer-string) "\n"))) (defun solver (data-file) (let ((register 1) (cycle 1) measures) (with-temp-buffer (dolist (instruction (solver-instructions data-file)) (solver-draw-pixel (mod (1- cycle) 40) register) (cl-incf cycle) (let ((step1 (solver-probe cycle register)) ;; the noop default (step2 ;; addx takes 2 cycles (when (string-prefix-p "addx" instruction) (solver-draw-pixel (mod (1- cycle) 40) register) (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 (apply #'+ measures) (buffer-string))))) (ert-deftest test-solver () (should (equal (solver "eg-in") (list 13140 " ##..##..##..##..##..##..##..##..##..##.. ###...###...###...###...###...###...###. ####....####....####....####....####.... #####.....#####.....#####.....#####..... ######......######......######......#### #######.......#######.......#######..... ."))) (should (equal (solver "input") (list 12540 " ####.####..##..####.####.#....#..#.####. #....#....#..#....#.#....#....#..#.#.... ###..###..#......#..###..#....####.###.. #....#....#.....#...#....#....#..#.#.... #....#....#..#.#....#....#....#..#.#.... #....####..##..####.####.####.#..#.####. .")))) (provide 'solver) ;;; solver.el ends here