(ns day-3.core
  (:require [clojure.java.io :as io])
  (:require [clojure.string :as str])
  (:use [clojure.test :only [is]])
  (:use [clojure.pprint])
  (:gen-class))

(def test-set "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))")
(def test-set-second "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))")

(defn solve-first [data]
  (->> (re-seq #"mul\((\d+),(\d+)\)" data)
       (map (partial drop 1))
       (map (partial map #(Integer/parseInt %)))
       (map (partial reduce *))
       (reduce +)))

(defn solve-second [data]
  (->> (str/split data #"do")
       (filter #(not (str/starts-with? % "n't()")))
       (map solve-first)
       (reduce +)))

(defn -main
  [& args]
  (let [data-set (slurp "data/day3.txt")]
    (println "(1) Test set...")
    (println (solve-first test-set))
    (println "(1) Large set...")
    (println (solve-first data-set))
    (println "(2) Test set...")
    (println (solve-second test-set-second))
    (println "(2) Large set...")
    (println (solve-second data-set))))