Created
December 6, 2020 01:52
-
-
Save devn/29ee7fc152e359dd6c3a604b372291fb to your computer and use it in GitHub Desktop.
Day 5, Advent of Code 2020
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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