Change-Id: I771335f351be3418dbb589c429411748564f07f5 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2227 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
		
			
				
	
	
		
			61 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;; Advent of Code 2020 - Day 5
 | |
| 
 | |
| (require 'cl-lib)
 | |
| (require 'dash)
 | |
| (require 'f)
 | |
| (require 'ht)
 | |
| (require 's)
 | |
| (require 'seq)
 | |
| 
 | |
| (defvar day5/input
 | |
|   (-filter (lambda (s) (not (seq-empty-p s)))
 | |
|            (s-lines (f-read "/tmp/aoc/day5.txt"))))
 | |
| 
 | |
| (defun day5/lower (sequence)
 | |
|   (seq-subseq sequence 0 (/ (length sequence) 2)))
 | |
| 
 | |
| (defun day5/upper (sequence)
 | |
|   (seq-subseq sequence (/ (length sequence) 2)))
 | |
| 
 | |
| (defun day5/seat-id (column row)
 | |
|   (+ column (* 8 row)))
 | |
| 
 | |
| (defun day5/find-seat (boarding-pass)
 | |
|   (let ((rows (number-sequence 0 127))
 | |
|         (columns (number-sequence 0 7)))
 | |
|     (cl-loop for char across boarding-pass
 | |
|              do (pcase char
 | |
|                   (?F (setq rows (day5/lower rows)))
 | |
|                   (?B (setq rows (day5/upper rows)))
 | |
|                   (?R (setq columns (day5/upper columns)))
 | |
|                   (?L (setq columns (day5/lower columns))))
 | |
|              finally return (day5/seat-id (car columns) (car rows)))))
 | |
| 
 | |
| ;; Puzzle 1
 | |
| 
 | |
| (message "Solution to day5/1: %s"
 | |
|          (cl-loop for boarding-pass in day5/input
 | |
|                   maximize (day5/find-seat boarding-pass)))
 | |
| 
 | |
| ;; Puzzle 2
 | |
| 
 | |
| (defun day5/all-seats-in (row)
 | |
|   (-map (lambda (column) (day5/seat-id column row))
 | |
|         (number-sequence 0 7)))
 | |
| 
 | |
| (message "Solution to day5/2: %s"
 | |
|          (let ((all-seats (ht-create)))
 | |
|            (-each (-mapcat #'day5/all-seats-in (number-sequence 1 126))
 | |
|              (lambda (seat) (ht-set all-seats seat nil)))
 | |
| 
 | |
|            (cl-loop for boarding-pass in day5/input
 | |
|                     do (ht-remove all-seats (day5/find-seat boarding-pass))
 | |
| 
 | |
|                     ;; Remove seats that lack adjacent entries, those
 | |
|                     ;; are missing on the plane.
 | |
|                     finally return
 | |
|                     (car
 | |
|                      (-filter (lambda (seat)
 | |
|                                 (and (not (ht-contains? all-seats (- seat 1)))
 | |
|                                      (not (ht-contains? all-seats (+ seat 1)))))
 | |
|                               (ht-keys all-seats))))))
 |