Skip to content

Commit c350de6

Browse files
committed
Day 5
1 parent 556cf35 commit c350de6

File tree

2 files changed

+62
-23
lines changed

2 files changed

+62
-23
lines changed

src/advent_2020_clojure/day05.clj

+36-20
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,45 @@
22
(:require [clojure.string :as str]))
33

44
(defn split-seat [seat] (split-at 7 seat))
5+
(defn low-instruction? [c] (#{\F \L} c))
56

6-
(defn get-row [front]
7-
(first (reduce (fn [[min max] dir]
8-
(let [midpoint (+ min (/ (- max min) 2))]
9-
(if (= \F dir) [min midpoint]
10-
[midpoint max])))
11-
[0 128]
12-
front)))
13-
14-
(defn get-column [back]
15-
(first (reduce (fn [[min max] dir]
16-
(let [midpoint (+ min (/ (- max min) 2))]
17-
(if (= \L dir) [min midpoint]
18-
[midpoint max])))
19-
[0 8]
20-
back)))
7+
(defn midpoint [low high]
8+
(-> (- high low) (/ 2) (+ low)))
9+
10+
(defn binary-space-partition [num-vals instructions]
11+
(->> (reduce (fn [[low high] dir]
12+
(let [midpoint (midpoint low high)]
13+
(if (low-instruction? dir) [low midpoint] [midpoint high])))
14+
[0 num-vals]
15+
instructions)
16+
first))
17+
18+
(defn find-row [instructions]
19+
(binary-space-partition 128 instructions))
20+
21+
(defn find-column [instructions]
22+
(binary-space-partition 8 instructions))
2123

2224
(defn seat-id [seat]
23-
(let [[front back] (split-seat seat)]
24-
(-> (* (get-row front) 8)
25-
(+ (get-column back)))))
25+
(let [[r c] (split-seat seat)]
26+
(-> (* (find-row r) 8)
27+
(+ (find-column c)))))
2628

27-
(defn part1 [input]
29+
(defn missing-within-collection [coll]
30+
(reduce (fn [prev v]
31+
(let [target (inc prev)]
32+
(if (= v target)
33+
v
34+
(reduced target))))
35+
(sort coll)))
36+
37+
(defn apply-to-seat-ids [input f]
2838
(->> (str/split-lines input)
2939
(map seat-id)
30-
(apply max)))
40+
f))
41+
42+
(defn part1 [input]
43+
(apply-to-seat-ids input (partial apply max)))
44+
45+
(defn part2 [input]
46+
(apply-to-seat-ids input missing-within-collection))

test/advent_2020_clojure/day05_test.clj

+26-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,32 @@
22
(:require [clojure.test :refer :all]
33
[advent-2020-clojure.day05 :refer :all]))
44

5-
(def TEST_DATA "")
65
(def PUZZLE_DATA (slurp "resources/day05_data.txt"))
76

8-
; PART 1: 818
7+
(deftest midpoint-test
8+
(is (= 64 (midpoint 0 128)))
9+
(is (= 32 (midpoint 0 64)))
10+
(is (= 96 (midpoint 64 128))))
11+
12+
(deftest find-row-test
13+
(is (= 70 (find-row "BFFFBBF")))
14+
(is (= 14 (find-row "FFFBBBF")))
15+
(is (= 102 (find-row "BBFFBBF"))))
16+
17+
(deftest find-column-test
18+
(is (= 7 (find-column "RRR")))
19+
(is (= 4 (find-column "RLL"))))
20+
21+
(deftest seat-id-test
22+
(is (= 567 (seat-id "BFFFBBFRRR")))
23+
(is (= 119 (seat-id "FFFBBBFRRR")))
24+
(is (= 820 (seat-id "BBFFBBFRLL"))))
25+
26+
(deftest missing-within-collection-test
27+
(is (= 3 (missing-within-collection [1 4 2 0 6 7 5]))))
28+
929
(deftest part1-test
10-
(is (= 818 (part1 PUZZLE_DATA))))
30+
(is (= 818 (part1 PUZZLE_DATA))))
31+
32+
(deftest part2-test
33+
(is (= 559 (part2 PUZZLE_DATA))))

0 commit comments

Comments
 (0)