aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Wardhaugh <tyler.wardhaugh@gmail.com>2020-12-03 08:50:14 -0800
committerTyler Wardhaugh <tyler.wardhaugh@gmail.com>2020-12-03 09:28:38 -0800
commit948067565ec965727e469008ea211895c5c25760 (patch)
tree4b2d69fdfe2401de01fff392086bc14be61d6d0a
parentc17e0f1b2383122f7e431e97407927db412c53e3 (diff)
downloadperlweeklychallenge-club-948067565ec965727e469008ea211895c5c25760.tar.gz
perlweeklychallenge-club-948067565ec965727e469008ea211895c5c25760.tar.bz2
perlweeklychallenge-club-948067565ec965727e469008ea211895c5c25760.zip
Ch89: Tasks 1 & 2 in Clojure
-rw-r--r--challenge-089/tyler-wardhaugh/clojure/README.md4
-rw-r--r--challenge-089/tyler-wardhaugh/clojure/deps.edn6
-rw-r--r--challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/core.clj12
-rw-r--r--challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t1.clj21
-rw-r--r--challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t2.clj38
-rw-r--r--challenge-089/tyler-wardhaugh/clojure/test/tw/weekly/c89_test.clj28
6 files changed, 105 insertions, 4 deletions
diff --git a/challenge-089/tyler-wardhaugh/clojure/README.md b/challenge-089/tyler-wardhaugh/clojure/README.md
index 8a9aa29a42..f5a89af18d 100644
--- a/challenge-089/tyler-wardhaugh/clojure/README.md
+++ b/challenge-089/tyler-wardhaugh/clojure/README.md
@@ -17,9 +17,9 @@ Run Task #1 with input
$ clojure -M -m tw.weekly.c89.t1 N
-Run Task #2 with input:
+Run Task #2:
- $ clojure -M -m tw.weekly.c89.t2 MATRIX-FILE
+ $ clojure -M -m tw.weekly.c89.t2
## Project Template
diff --git a/challenge-089/tyler-wardhaugh/clojure/deps.edn b/challenge-089/tyler-wardhaugh/clojure/deps.edn
index f09671a417..cfd5d782d1 100644
--- a/challenge-089/tyler-wardhaugh/clojure/deps.edn
+++ b/challenge-089/tyler-wardhaugh/clojure/deps.edn
@@ -1,7 +1,9 @@
{:paths ["src" "resources"]
:deps {org.clojure/clojure {:mvn/version "1.10.1"}
- net.mikera/core.matrix {:mvn/version "0.62.0"}
- org.clojure/math.numeric-tower {:mvn/version "0.0.4"}}
+ org.clojure/core.logic {:mvn/version "1.0.0"}
+ org.clojure/math.combinatorics {:mvn/version "0.1.6"}
+ org.clojure/math.numeric-tower {:mvn/version "0.0.4"}
+ org.clojure/tools.macro {:mvn/version "0.1.2"}}
:aliases
{:test {:extra-paths ["test"]
:extra-deps {org.clojure/test.check {:mvn/version "1.0.0"}}}
diff --git a/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/core.clj b/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/core.clj
new file mode 100644
index 0000000000..f3bd12eeb8
--- /dev/null
+++ b/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/core.clj
@@ -0,0 +1,12 @@
+(ns tw.weekly.c89.core
+ (:require [tw.weekly.c89.t1 :as t1])
+ (:require [tw.weekly.c89.t2 :as t2])
+ (:gen-class))
+
+(defn -main
+ "Run all tasks"
+ [& _]
+ (println "Task #1:")
+ (t1/-main)
+ (println "\nTask #2:")
+ (t2/-main))
diff --git a/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t1.clj b/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t1.clj
new file mode 100644
index 0000000000..f8bd9c96ae
--- /dev/null
+++ b/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t1.clj
@@ -0,0 +1,21 @@
+(ns tw.weekly.c89.t1
+ (:require [clojure.edn :as edn])
+ (:require [clojure.math.combinatorics :as combo])
+ (:require [clojure.math.numeric-tower :as math]))
+
+;;;
+; Task description for TASK #1 › GCD Sum
+;;;
+
+(defn gcd-sum
+ "Sum of the GCD of all possible unique pairs between 1 and n."
+ [n]
+ (let [xf (map (partial apply math/gcd))]
+ (transduce xf + (-> (range 1 (inc n)) (combo/combinations 2)))))
+
+(defn -main
+ "Run Task 1 with a list of numbers N, defaulting to the
+ first example given in the task description."
+ [& args]
+ (let [N (or (some-> args first edn/read-string) 3)]
+ (println (gcd-sum N))))
diff --git a/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t2.clj b/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t2.clj
new file mode 100644
index 0000000000..8db6f9fb5a
--- /dev/null
+++ b/challenge-089/tyler-wardhaugh/clojure/src/tw/weekly/c89/t2.clj
@@ -0,0 +1,38 @@
+(ns tw.weekly.c89.t2
+ (:require [clojure.tools.macro :refer [symbol-macrolet]])
+ (:require [clojure.core.logic :as l])
+ (:require [clojure.core.logic.fd :as fd]))
+
+;;;
+; Task description for TASK #2 › Magical Matrix
+;;;
+
+(defn magic-matrix
+ "Compute the magic matrix for a 3x3 square."
+ []
+ (symbol-macrolet
+ [_ (l/lvar)]
+ (let [a _ b _ c _
+ d _ e _ f _
+ g _ h _ i _
+ m [[a b c] [d e f] [g h i]]
+ cm (apply concat m)]
+ (first
+ (l/run 1 [q]
+ (l/== q m)
+ (l/everyg (fn [q] (fd/in q (fd/interval 1 9))) cm)
+ (fd/distinct cm)
+ (fd/eq
+ (= 15 (+ a b c))
+ (= 15 (+ d e f))
+ (= 15 (+ g h i))
+ (= 15 (+ a d g))
+ (= 15 (+ b e h))
+ (= 15 (+ c f i))
+ (= 15 (+ a e i))
+ (= 15 (+ c e g))))))))
+
+(defn -main
+ "Run Task 2"
+ []
+ (run! println (magic-matrix)))
diff --git a/challenge-089/tyler-wardhaugh/clojure/test/tw/weekly/c89_test.clj b/challenge-089/tyler-wardhaugh/clojure/test/tw/weekly/c89_test.clj
new file mode 100644
index 0000000000..db9b34598f
--- /dev/null
+++ b/challenge-089/tyler-wardhaugh/clojure/test/tw/weekly/c89_test.clj
@@ -0,0 +1,28 @@
+(ns tw.weekly.c89-test
+ (:require [clojure.test :refer [deftest is testing]]
+ [tw.weekly.c89.t1 :refer [gcd-sum]]
+ [tw.weekly.c89.t2 :refer [magic-matrix]]))
+
+(deftest task-1
+ (testing "Task 1, GCD Sum"
+ (is (= 3 (gcd-sum 3)))))
+
+(defn transpose [m]
+ (apply mapv vector m))
+
+(defn rotate [m]
+ (reverse (transpose m)))
+
+(def task-2-possible-answers
+ (let [base [[2 7 6]
+ [9 5 1]
+ [4 3 8]]
+ reversed (vec (reverse base))
+ transposed (transpose base)
+ rev-xposed (vec (reverse transposed))
+ unrotated [base reversed transposed rev-xposed]]
+ (into (set unrotated) (map (comp vec rotate)) unrotated)))
+
+(deftest task-2
+ (testing "Task 2, Magical Matrix"
+ (is (some? (task-2-possible-answers (magic-matrix))))))