#+title: Solution to p1 First load the data as a list of positive or negative numbers #+begin_src emacs-lisp :results none (with-temp-buffer (insert-file-contents "input") (advent/replace-multiple-regex-buffer '(("L" . "-") ("R" . ""))) (goto-char (point-min)) (insert "(setq data '(") (goto-char (point-max)) (insert "))") (eval-buffer)) #+end_src Then add the rotations starting from the initial offset and count the number of 0's mod 100; that is what we need for part 1 #+begin_src emacs-lisp (length (--filter (= 0 it) (--map (mod it 100) (-running-sum (cons 50 data))))) #+end_src #+RESULTS: : 962 For part 2, This works: - we count the number of full turns that have been done in each rotation. Since there are corner cases we need to average over two offsets of ½ #+begin_src emacs-lisp (defun advent/consecutive-pairs (list) (-zip-pair list (cdr list))) (defun average (li) (/ (-sum li) (length li))) (let ((number-lists (--map (-running-sum (cons it data)) (list 50.5 49.5)))) (average (--map (-sum (--map (abs (- (car it) (cdr it))) (advent/consecutive-pairs (--map (floor it 100) it)))) number-lists))) #+end_src #+RESULTS: : 5782