Change-Id: Id149ff13d1e903a578cdcdc3a8d0045cfefaecfa Reviewed-on: https://cl.tvl.fyi/c/depot/+/2224 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
;; Advent of Code 2020 - Day 2
 | 
						|
 | 
						|
(require 'cl-lib)
 | 
						|
(require 'f)
 | 
						|
(require 'ht)
 | 
						|
(require 's)
 | 
						|
(require 'seq)
 | 
						|
 | 
						|
(defvar day2/input
 | 
						|
  ;; This one was too large to inline.
 | 
						|
  (s-lines (f-read "/tmp/aoc/day2.txt")))
 | 
						|
 | 
						|
(defun day2/count-letters (password)
 | 
						|
  (let ((table (ht-create)))
 | 
						|
    (cl-loop for char across password
 | 
						|
             for current = (ht-get table char)
 | 
						|
             do (ht-set table char
 | 
						|
                        (if current (+ 1 current) 1)))
 | 
						|
    table))
 | 
						|
 | 
						|
(defun day2/parse (input)
 | 
						|
  (let* ((split (s-split " " input))
 | 
						|
         (range (s-split "-" (car split))))
 | 
						|
    (list (string-to-number (car range))
 | 
						|
          (string-to-number (cadr range))
 | 
						|
          (string-to-char (cadr split))
 | 
						|
          (caddr split))))
 | 
						|
 | 
						|
(defun day2/count-with-validation (func)
 | 
						|
  (length (-filter
 | 
						|
           (lambda (password)
 | 
						|
             (and (not (seq-empty-p password))
 | 
						|
                  (apply func (day2/parse password))))
 | 
						|
           day2/input)))
 | 
						|
 | 
						|
;; Puzzle 1
 | 
						|
 | 
						|
(defun day2/validate-oldjob (min max char password)
 | 
						|
  (let ((count (ht-get (day2/count-letters password) char)))
 | 
						|
    (when count
 | 
						|
      (and (>= count min)
 | 
						|
           (<= count max)))))
 | 
						|
 | 
						|
(message "Solution to day2/1: %s"
 | 
						|
         (day2/count-with-validation #'day2/validate-oldjob))
 | 
						|
 | 
						|
;; Puzzle 2
 | 
						|
 | 
						|
(defun day2/validate-toboggan (pos1 pos2 char password)
 | 
						|
  (xor (= char (aref password (- pos1 1)))
 | 
						|
       (= char (aref password (- pos2 1)))))
 | 
						|
 | 
						|
(message "Solution to day2/2: %s"
 | 
						|
         (day2/count-with-validation #'day2/validate-toboggan))
 |