-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday04.clj
40 lines (30 loc) · 976 Bytes
/
day04.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
(ns day04
(:require aoc
[clojure.string :as str]
[clojure.math :refer [pow]]))
(defn parse-line [line]
(let [[_ w y] (str/split line #":|\|")]
{:winning (set (aoc/integers w))
:your (aoc/integers y)}))
(defn winning-numbers [{:keys [winning your]}]
(count (keep winning your)))
(defn points [amount]
(if (zero? amount) 0
(int (pow 2 (dec amount)))))
(defn new-rules [winners]
(let [size (count winners)]
(reduce
(fn [amounts line]
(let [copies (amounts line)]
(reduce (fn [amounts delta]
(update amounts (+ line delta) + copies))
amounts
(range 1 (inc (winners line))))))
(vec (repeat size 1))
(range size))))
(defn solve [input]
(let [lines (aoc/parse-input input parse-line)
winners (mapv winning-numbers lines)]
[(aoc/sum-map points winners)
(reduce + (new-rules winners))]))
(solve (aoc/read-file 4))