aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2023-05-28 23:22:58 +0100
committerGitHub <noreply@github.com>2023-05-28 23:22:58 +0100
commite685e6dc9d4dea335d78d36beee7c595f266bee8 (patch)
tree9101b281df6527f090731c9e445dcaa545436e82
parentc966720fe58763e6e01cf482b19b27d341b68936 (diff)
parent2e77aaaad5e82d9bf28f70bb5f0030364d9e41d5 (diff)
downloadperlweeklychallenge-club-e685e6dc9d4dea335d78d36beee7c595f266bee8.tar.gz
perlweeklychallenge-club-e685e6dc9d4dea335d78d36beee7c595f266bee8.tar.bz2
perlweeklychallenge-club-e685e6dc9d4dea335d78d36beee7c595f266bee8.zip
Merge pull request #8149 from tylerw/tw/challenge-218
Ch218: implement Task 1 in Clojure
-rw-r--r--challenge-218/tyler-wardhaugh/clojure/README.md4
-rw-r--r--challenge-218/tyler-wardhaugh/clojure/bb.edn2
-rw-r--r--challenge-218/tyler-wardhaugh/clojure/build.clj19
-rw-r--r--challenge-218/tyler-wardhaugh/clojure/deps.edn4
-rw-r--r--challenge-218/tyler-wardhaugh/clojure/src/c218/t1.clj23
-rw-r--r--challenge-218/tyler-wardhaugh/clojure/test/c218/t1_test.clj10
6 files changed, 57 insertions, 5 deletions
diff --git a/challenge-218/tyler-wardhaugh/clojure/README.md b/challenge-218/tyler-wardhaugh/clojure/README.md
index edcc7f57c7..130e9d2771 100644
--- a/challenge-218/tyler-wardhaugh/clojure/README.md
+++ b/challenge-218/tyler-wardhaugh/clojure/README.md
@@ -1,6 +1,6 @@
-# c217
+# c218
-The Weekly Challenge — #217 — Tyler Wardhaugh
+The Weekly Challenge — #218 — Tyler Wardhaugh
## Usage
diff --git a/challenge-218/tyler-wardhaugh/clojure/bb.edn b/challenge-218/tyler-wardhaugh/clojure/bb.edn
index e9f441cb63..fb73b927b3 100644
--- a/challenge-218/tyler-wardhaugh/clojure/bb.edn
+++ b/challenge-218/tyler-wardhaugh/clojure/bb.edn
@@ -1,6 +1,6 @@
{
:paths ["src" "resources"]
- :deps {c217/c217 {:local/root "."}}
+ :deps {c218/c218 {:local/root "."}}
:tasks
{
diff --git a/challenge-218/tyler-wardhaugh/clojure/build.clj b/challenge-218/tyler-wardhaugh/clojure/build.clj
new file mode 100644
index 0000000000..29381cb7c3
--- /dev/null
+++ b/challenge-218/tyler-wardhaugh/clojure/build.clj
@@ -0,0 +1,19 @@
+(ns build
+ (:refer-clojure :exclude [test])
+ (:require [org.corfield.build :as bb]))
+
+(def lib 'net.clojars.c218/c218)
+(def version "0.1.0-SNAPSHOT")
+(def main 'c218.c218)
+
+(defn test "Run the tests." [opts]
+ (bb/run-tests opts))
+
+(def clean bb/clean)
+
+(defn ci "Run the CI pipeline of tests (and build the uberjar)." [opts]
+ (-> opts
+ (assoc :lib lib :version version :main main)
+ (bb/run-tests)
+ (bb/clean)
+ (bb/uber)))
diff --git a/challenge-218/tyler-wardhaugh/clojure/deps.edn b/challenge-218/tyler-wardhaugh/clojure/deps.edn
index 9c7a50a024..3d77f22cca 100644
--- a/challenge-218/tyler-wardhaugh/clojure/deps.edn
+++ b/challenge-218/tyler-wardhaugh/clojure/deps.edn
@@ -1,8 +1,8 @@
{:paths ["src" "resources"]
:deps {org.clojure/clojure {:mvn/version "1.11.1"}}
:aliases
- {:t1 {:main-opts ["-m" "c217.t1"]}
- :t2 {:main-opts ["-m" "c217.t2"]}
+ {:t1 {:main-opts ["-m" "c218.t1"]}
+ :t2 {:main-opts ["-m" "c218.t2"]}
:build {:deps {io.github.seancorfield/build-clj
{:git/tag "v0.8.3" :git/sha "7ac1f8d"
;; since we're building an app uberjar, we do not
diff --git a/challenge-218/tyler-wardhaugh/clojure/src/c218/t1.clj b/challenge-218/tyler-wardhaugh/clojure/src/c218/t1.clj
new file mode 100644
index 0000000000..2f466fe133
--- /dev/null
+++ b/challenge-218/tyler-wardhaugh/clojure/src/c218/t1.clj
@@ -0,0 +1,23 @@
+(ns c218.t1
+ (:require
+ [clojure.edn :as edn]))
+
+(def DEFAULT-INPUT [[3 1 2]])
+
+(defn max-product
+ [coll]
+ (let [sorted (->> coll sort (into []))
+ len (count sorted)
+ three-largest (subvec sorted (- len 3))
+ two-smallest-and-largest (concat (subvec sorted 0 2) [(peek sorted)])]
+ (tap> [sorted three-largest two-smallest-and-largest])
+ (->> [three-largest two-smallest-and-largest]
+ (map #(reduce * 1 %))
+ (apply max))))
+
+(defn -main
+ "Run Task 1 with a given input COLL, defaulting to the first example from the
+ task description."
+ [& args]
+ (let [[coll] (or (some->> args (map edn/read-string)) DEFAULT-INPUT)]
+ (println (max-product coll))))
diff --git a/challenge-218/tyler-wardhaugh/clojure/test/c218/t1_test.clj b/challenge-218/tyler-wardhaugh/clojure/test/c218/t1_test.clj
new file mode 100644
index 0000000000..4350e5abd5
--- /dev/null
+++ b/challenge-218/tyler-wardhaugh/clojure/test/c218/t1_test.clj
@@ -0,0 +1,10 @@
+(ns c218.t1-test
+ (:require [clojure.test :refer [deftest is testing]]
+ [c218.t1 :refer [max-product]]))
+
+(deftest task-1
+ (testing "Task 1 produces the correct results from examples in the description"
+ (is (= 6 (max-product [3 1 2])))
+ (is (= 24 (max-product [4 1 3 2])))
+ (is (= 3 (max-product [-1 0 1 3 1])))
+ (is (= 216 (max-product [-8 2 -9 -4 3])))))