38 lines
993 B
Clojure
38 lines
993 B
Clojure
(require '[clojure.string :as str])
|
|
(require '[clojure.set])
|
|
(require '[clojure.zip :as zip])
|
|
|
|
(def elves (str/split-lines (slurp "input/3")))
|
|
(defn priority [char]
|
|
(let [
|
|
c (int char)
|
|
a (int \a)
|
|
z (int \z)
|
|
A (int \A)
|
|
]
|
|
(if (<= a c z)
|
|
(+ (- c a) 1)
|
|
(+ (- c A) 27))))
|
|
|
|
; Part 1
|
|
(defn two-knapsacks [line] (
|
|
let [
|
|
half (/ (count line) 2)
|
|
[knapsack-1 knapsack-2] (map set (split-at half line))
|
|
]
|
|
(priority (first (clojure.set/intersection knapsack-1 knapsack-2)
|
|
))))
|
|
(println (reduce + (map two-knapsacks elves)))
|
|
|
|
; Part 2
|
|
(defn chunker [sequence num]
|
|
(if (<= (count sequence) num)
|
|
[sequence]
|
|
(let [[head tail] (split-at num sequence)] (lazy-seq (cons head (chunker tail num))))))
|
|
(defn three-elves [lines] (
|
|
let [
|
|
sets (map set lines)
|
|
common (apply clojure.set/intersection sets)
|
|
]
|
|
(priority (first common))))
|
|
(println (reduce + (map three-elves (chunker elves 3)))) |