/
core.clj
38 lines (32 loc) · 1.25 KB
/
core.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
(ns day-09.core
(:gen-class))
(defn decompressed-len
([f s]
(decompressed-len f s 0))
([f s len]
(if (empty? s) len
(let [[unused comp-len] (f s)]
(recur f unused (+ len comp-len))))))
(defn process-char-v1
[s]
(if (=\( (first s))
(let [[_ num-take num-reps remaining] (re-matches #"\((\d+)x(\d+)\)(.*)"
(apply str s))
[taken unused] (split-at (Integer. num-take) remaining)]
(list unused (* (Integer. num-reps) (count taken))))
(list (rest s) 1)))
(defn process-char-v2
[s]
(if (=\( (first s))
(let [[_ num-take num-reps remaining] (re-matches #"\((\d+)x(\d+)\)(.*)"
(apply str s))
[taken unused] (split-at (Integer. num-take) remaining)]
(list unused
(* (Integer. num-reps) (decompressed-len process-char-v2 taken 0))))
(list (rest s) 1)))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(let [input-file (filter #(not (Character/isWhitespace %)) (slurp "input.txt"))]
(println "v1 Length = " (decompressed-len process-char-v1 input-file))
(println "v2 Length = " (decompressed-len process-char-v2 input-file))))