aboutsummaryrefslogtreecommitdiffstats
path: root/src/aoc_2022/utils.clj
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2022-12-04 15:14:47 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2022-12-04 17:02:06 +0200
commit1adba42708436a86db1f369028fb6fae4bc4eda8 (patch)
tree7ecf237e098b6886ae451c04d58e5a79718b3e19 /src/aoc_2022/utils.clj
parent576d3eae2d75a05b8191d7168e19ff71a8c3b0e0 (diff)
Add util fns
Diffstat (limited to 'src/aoc_2022/utils.clj')
-rw-r--r--src/aoc_2022/utils.clj54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/aoc_2022/utils.clj b/src/aoc_2022/utils.clj
index 57bfa88..4ade901 100644
--- a/src/aoc_2022/utils.clj
+++ b/src/aoc_2022/utils.clj
@@ -1,3 +1,57 @@
(ns aoc-2022.utils)
+(require '[clojure.string :as str])
+
+; Debugging
(def spy #(do (println "DEBUG:" %) %))
+
+; Number parsing
+
+(def to-long #(Long/valueOf %))
+(def to-float #(Float/valueOf %))
+
+; Collections
+
+(defn- split-by' [delim acc [x & xs]]
+ (condp = x
+ nil (list (reverse acc))
+ delim (cons (reverse acc) (split-by' delim '() xs))
+ ; otherwise
+ (split-by' delim (cons x acc) xs)))
+
+(def split-by #(split-by' %1 '() %2))
+
+; Advent of Code specific
+
+(defn read-aoc [day]
+ (let [slurp-f #(str/split-lines (slurp (format % day)))]
+ {:sample (slurp-f "resources/%s_sample.txt")
+ :actual (slurp-f "resources/%s_actual.txt")}))
+
+(defn run-aoc
+ "Reads input files for `day` and invokes given `task1` and `task2` functions with the contents.
+ `task1` and `task2` should take a list of strings as their first argument."
+ [day task1 task2]
+ (let [{:keys [sample actual]} (read-aoc day)]
+ (do
+ (println "task1 @ sample:" (task1 sample))
+ (println "task1 @ actual:" (task1 actual))
+ (println "task2 @ sample:" (task2 sample))
+ (println "task2 @ actual:" (task2 actual)))))
+
+; Functions
+
+(defn chain "forward compose: comp fns in reverse order" [& fns]
+ (apply comp (reverse fns)))
+
+; Logic
+
+(defmacro nand
+ "Logical NAND. `(nand a b c)` is equivalent to `(not (and a b c))`."
+ [& args]
+ (list 'not (cons 'and args)))
+
+(defmacro nor
+ "Logical NOR. `(nor a b c)` is equivalent to `(not (or a b c))`."
+ [& args]
+ (list 'not (cons 'or args)))