Skip to content

Instantly share code, notes, and snippets.

@devn
Created December 6, 2020 01:52
Show Gist options
  • Save devn/29ee7fc152e359dd6c3a604b372291fb to your computer and use it in GitHub Desktop.
Save devn/29ee7fc152e359dd6c3a604b372291fb to your computer and use it in GitHub Desktop.
Day 5, Advent of Code 2020
(ns day05
(:require [clojure.string :as str]
[clojure.set :as set]))
(def boarding-passes "...")
(defn find-pos [ops size lower-op upper-op]
(loop [ops ops
xs (range 0 (inc size))]
(if (seq ops)
(let [middle (quot (count xs) 2)
[lower upper] ((juxt first last) (split-at middle xs))]
(condp = (first ops)
lower-op (recur (rest ops) lower)
upper-op (recur (rest ops) upper)))
(first xs))))
(defn find-row [record-locator]
(find-pos (take 7 record-locator) 127 \F \B))
(defn find-seat [record-locator]
(find-pos (take-last 3 record-locator) 7 \L \R))
(defn seat-id [record-locator]
(let [[row column] ((juxt find-row find-seat) record-locator)]
(+ (* row 8) column)))
;; Part I
(defn max-seat-id [boarding-passes]
(apply max (map seat-id (str/split-lines boarding-passes))))
;; Part II
(defn find-my-seat-1 [boarding-passes]
(first (let [ids (map seat-id (str/split-lines boarding-passes))]
(set/difference
(set (range (apply min ids) (inc (apply max ids))))
(set ids)))))
;; OR
(defn first-non-consecutive [nums]
(loop [nums nums]
(if-not (= (first nums)
(dec (second nums)))
(second nums)
(recur (rest nums)))))
(defn find-my-seat-2 [boarding-passes]
(->> boarding-passes
str/split-lines
(map seat-id)
sort
first-non-consecutive
dec))
(comment
(find-pos "FBFBBFF" 127 \F \B) ;; => 44
(find-pos "RLR" 7 \L \R) ;; => 5
(seat-id "FBFBBFFRLR") ;; => 357
(max-seat-id boarding-passes) ;; => 838
(find-my-seat-1 boarding-passes) ;; => 714
(find-my-seat-2 boarding-passes) ;; => 714
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment