aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-11-09 00:27:15 -0800
committerTyler Wardhaugh <tyler.wardhaugh@gmail.com>2021-11-13 16:49:14 -0800
commit9c75eb4f419bba343e1a0479dc81961246bc5929 (patch)
treeebaa8f9d94bcf6d06718d7962ba25c32fdbf6299
parent0814a5fbb2b360dc72ef19246ae752f2efa96d67 (diff)
downloadperlweeklychallenge-club-9c75eb4f419bba343e1a0479dc81961246bc5929.tar.gz
perlweeklychallenge-club-9c75eb4f419bba343e1a0479dc81961246bc5929.tar.bz2
perlweeklychallenge-club-9c75eb4f419bba343e1a0479dc81961246bc5929.zip
Ch138 (Clojure): Task 2
-rw-r--r--challenge-138/tyler-wardhaugh/clojure/deps.edn3
-rw-r--r--challenge-138/tyler-wardhaugh/clojure/src/tw/weekly/c138/t2.clj36
-rw-r--r--challenge-138/tyler-wardhaugh/clojure/test/tw/weekly/c138/t2_test.clj6
3 files changed, 40 insertions, 5 deletions
diff --git a/challenge-138/tyler-wardhaugh/clojure/deps.edn b/challenge-138/tyler-wardhaugh/clojure/deps.edn
index 54edd9d65e..15aa02e4d4 100644
--- a/challenge-138/tyler-wardhaugh/clojure/deps.edn
+++ b/challenge-138/tyler-wardhaugh/clojure/deps.edn
@@ -1,7 +1,8 @@
{:paths ["src" "resources"]
:deps {org.clojure/clojure {:mvn/version "1.10.3"}
clojure.java-time/clojure.java-time {:mvn/version "0.3.3"}
- org.threeten/threeten-extra {:mvn/version "1.7.0"}}
+ org.threeten/threeten-extra {:mvn/version "1.7.0"}
+ org.clojure/math.numeric-tower {:mvn/version "0.0.4"}}
:aliases
{:test {:extra-paths ["test"]
:extra-deps {org.clojure/test.check {:mvn/version "1.1.0"}
diff --git a/challenge-138/tyler-wardhaugh/clojure/src/tw/weekly/c138/t2.clj b/challenge-138/tyler-wardhaugh/clojure/src/tw/weekly/c138/t2.clj
index ca4530b799..714b0beb42 100644
--- a/challenge-138/tyler-wardhaugh/clojure/src/tw/weekly/c138/t2.clj
+++ b/challenge-138/tyler-wardhaugh/clojure/src/tw/weekly/c138/t2.clj
@@ -1,14 +1,46 @@
(ns tw.weekly.c138.t2
- (:require [clojure.edn :as edn]))
+ (:require [clojure.edn :as edn]
+ [clojure.pprint :refer [cl-format]]
+ [clojure.string :as str]
+ [clojure.math.numeric-tower :refer [sqrt expt]]))
;;;
; Task description for TASK #2 › Split Number
;;;
(def DEFAULT-INPUT [81])
+(defn ->int
+ [n] (Integer/parseInt n 10))
+
+(defn n->break [len n]
+ (-> n
+ (bit-shift-left 1)
+ (->> (cl-format nil "~v,'0b" len))
+ (str/escape {\1 \+ \0 \-})))
+
+(defn get-splits
+ [n]
+ (let [s (str n)
+ len (count s)
+ breaks (map (partial n->break len) (range 1 (expt 2 (dec len))))
+ join-nums (fn [coll]
+ (when (not= [\+] coll)
+ (->> coll (remove #{\-}) (str/join "") ->int)))
+ xf (map (comp (partial keep join-nums)
+ (partial partition-by #{\+})
+ (partial interleave s)))]
+ (sequence xf breaks)))
+
+(defn sum-of-splits?
+ [n]
+ (let [source (get-splits n)
+ xf (comp (map (partial reduce +)) (keep #(when (= % (sqrt n)) true)))
+ f (completing (fn [_ v] (reduced v)))]
+ (transduce xf f false source)))
+
(defn -main
"Run Task 2 with a given input N, defaulting to the first example from the
task description."
[& args]
(let [[N] (or (some->> args (map edn/read-string)) DEFAULT-INPUT)]
- ))
+ (println (if (sum-of-splits? N) 1 0))))
diff --git a/challenge-138/tyler-wardhaugh/clojure/test/tw/weekly/c138/t2_test.clj b/challenge-138/tyler-wardhaugh/clojure/test/tw/weekly/c138/t2_test.clj
index 71d2fe47e4..b2a3ef3bb1 100644
--- a/challenge-138/tyler-wardhaugh/clojure/test/tw/weekly/c138/t2_test.clj
+++ b/challenge-138/tyler-wardhaugh/clojure/test/tw/weekly/c138/t2_test.clj
@@ -1,7 +1,9 @@
(ns tw.weekly.c138.t2-test
(:require [clojure.test :refer [deftest is testing]]
- [tw.weekly.c138.t2 :refer []]))
+ [tw.weekly.c138.t2 :refer [sum-of-splits?]]))
(deftest examples
(testing "Examples from description"
- ))
+ (is (true? (sum-of-splits? 81)))
+ (is (true? (sum-of-splits? 9801)))
+ (is (false? (sum-of-splits? 36)))))