aboutsummaryrefslogtreecommitdiffstats
path: root/day3/part2.clj
blob: cbbe35f5822829a4d074f8b1f570f6618a5488c3 (plain)
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
(def bitcount 12)
(def input
  (loop [tot []]
    (let [line (read-line)]
      (if (empty? line)
        tot
        (recur (conj tot (Integer/parseInt line 2)))
        )
      )
    )
  )

(defn countbit [lst bit]
  (->> lst
       (map #(if (bit-test % bit) 1 0))
       (apply +)
       )
  )
(defn filterbit [lst bit v]
  (if (= 1 (count lst))
    lst
    (loop [l lst r []]
      (if (empty? l)
        r
        (recur
          (rest l)
          (if (= (bit-test (first l) bit) v)
            (conj r (first l))
            r
            )
          )
        )
      )
    )
  )

(loop [bit (dec bitcount) lst0 input lst1 input]
  (if (and (= 1 (count lst0)) (= 1 (count lst1)))
    (println (* (first lst0) (first lst1)))
    (recur
      (dec bit)
      (filterbit lst0 bit (>= (countbit lst0 bit) (/ (count lst0) 2)))
      (filterbit lst1 bit (< (countbit lst1 bit) (/ (count lst1) 2)))
      )
    )
  )