day3: little more touch-up

master
Clyne 3 years ago
parent f413e05528
commit d9394b84b1

@ -1,17 +1,16 @@
(require '[clojure.string :as str]) (require '[clojure.string :as str])
(println (->> "./in"
(->> "./in" (slurp)
(slurp) (str/split-lines)
(str/split-lines) (map (fn [l] (map #(if (= % \1) 1 0) l)))
(map (fn [l] (map #(if (= % \1) 1 0) l))) (apply (partial map +))
(apply (partial map +)) (map #(if (< % 500) \1 \0))
(map #(if (< % 500) \1 \0)) (str/join)
(str/join) (#(Integer/parseInt % 2))
(#(Integer/parseInt % 2)) (#(* % (bit-xor % (dec (int (Math/pow 2 12))))))
(#(* % (bit-xor % (dec (int (Math/pow 2 12)))))) (println)
) )
)
; (->> input data file name ; (->> input data file name
; read in entire contents ; read in entire contents
@ -22,4 +21,5 @@
; join characters into single string ; join characters into single string
; convert binary string to a number (gamma) ; convert binary string to a number (gamma)
; multiply gamma by its bit-inverse (bit length hard-coded) ; multiply gamma by its bit-inverse (bit length hard-coded)
; print results

@ -1,13 +1,12 @@
(require '[clojure.string :as str])
(def bitcount 12) (def bitcount 12)
(def input (def input
(loop [tot []] (->> "./in"
(let [line (read-line)] (slurp)
(if (empty? line) (str/split-lines)
tot (map #(Integer/parseInt % 2))
(recur (conj tot (Integer/parseInt line 2)))
)
) )
)
) )
(defn countbit [lst bit] (defn countbit [lst bit]
@ -16,27 +15,17 @@
(apply +) (apply +)
) )
) )
(defn filterbit [lst bit v] (defn filterbit [lst bit v]
(if (= 1 (count lst)) (if (= 1 (count lst))
lst lst
(loop [l lst r []] (filter #(= (bit-test % bit) v) lst)
(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] (loop [bit (dec bitcount) lst0 input lst1 input]
(if (and (= 1 (count lst0)) (= 1 (count lst1))) (if (and (= 1 (count lst0)) (= 1 (count lst1)))
(println (* (first lst0) (first lst1))) (println (map * lst0 lst1))
(recur (recur
(dec bit) (dec bit)
(filterbit lst0 bit (>= (countbit lst0 bit) (/ (count lst0) 2))) (filterbit lst0 bit (>= (countbit lst0 bit) (/ (count lst0) 2)))

Loading…
Cancel
Save