about summary refs log tree commit diff
path: root/day23.clj
blob: 5481e138b8a97975b048d08d3c3b8d58515c8026 (plain) (blame)
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
(def data
  (->> "158937462"
       (map str)
       (map read-string)))

(defn split-after [e l]
  (let [[h t] (split-with (partial not= e) l)]
    [(concat h [(first t)]) (rest t)]))

(defn first-smaller [n l]
  (if (< n 1)
    (first-smaller (reduce max l) l)
    (if (some #{n} l)
      n
      (first-smaller (dec n) l))))

(defn step [data]
  (let [[c t1 t2 t3 & r] data
        d (first-smaller (dec c) r)
        [h t] (split-after d r)]
    (concat h [t1 t2 t3] t [c])))

(defn final [data]
  (let [[h t] (split-with (partial not= 1) data)]
    (concat (rest t) h)))

(->> data
     (iterate step)
     (#(nth % 101))
     final
     (apply str))
;; => "69473825"

(def data2
  (concat data (range 10 1000001)))

(defn link-up [l]
  (->> l
       (partition 2 1)
       (reduce #(apply assoc %1 %2)
               (vec (repeat (inc (count l)) nil)))
       (#(assoc %
                (last l) (first l)
                0 (first l)))))

(defn first-smaller2 [val seen]
  (if (seen val)
    (recur (mod (dec val) 1000001) seen)
    val))

(defn step2 [state]
  (let [cur (state 0)
        a (state cur)
        b (state a)
        c (state b)
        n (state c)
        cval (first-smaller2 (dec cur) #{a b c 0})
        ins (state cval)]
    (assoc state
           0 n
           cur n
           cval a
           c ins)))

(->> data2
     link-up
     (iterate step2)
     (#(nth % 10000001))
     (#(* (% 1) (% (% 1)))))
;; => 96604396189