From 169f373f77d14b506191ab2c2e65b1ee6d8404fc Mon Sep 17 00:00:00 2001 From: Tyler Wardhaugh Date: Mon, 21 Sep 2020 08:33:53 -0700 Subject: prep for Challenge 079 --- challenge-079/tyler-wardhaugh/clojure/README.md | 10 +++++----- challenge-079/tyler-wardhaugh/clojure/deps.edn | 4 ++-- challenge-079/tyler-wardhaugh/clojure/pom.xml | 12 ++++++------ .../tyler-wardhaugh/clojure/src/tw/weekly/c79/core.clj | 12 ++++++++++++ .../tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj | 12 ++++++++++++ .../tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj | 10 ++++++++++ .../tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj | 12 ++++++++++++ 7 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/core.clj create mode 100644 challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj create mode 100644 challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj create mode 100644 challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj diff --git a/challenge-079/tyler-wardhaugh/clojure/README.md b/challenge-079/tyler-wardhaugh/clojure/README.md index bf7c680763..b576ec7183 100644 --- a/challenge-079/tyler-wardhaugh/clojure/README.md +++ b/challenge-079/tyler-wardhaugh/clojure/README.md @@ -1,13 +1,13 @@ -# tw.weekly.c78 +# tw.weekly.c79 -The Weekly Challenge - #078 - Tyler Wardhaugh +The Weekly Challenge - #079 - Tyler Wardhaugh ## Usage Run the project directly (shows default output from both tasks): - $ clojure -m tw.weekly.c78.core + $ clojure -m tw.weekly.c79.core Run the project's tests (which are samples from the task descriptions): @@ -15,11 +15,11 @@ Run the project's tests (which are samples from the task descriptions): Run Task #1 with input - $ clojure -m tw.weekly.c78.t1 9 10 7 5 6 1 + $ clojure -m tw.weekly.c79.t1 N Run Task #2 with input: - $ clojure -m tw.weekly.c78.t2 "(10 20 30 40 50)" "(3 4)" + $ clojure -m tw.weekly.c79.t2 A1 A2 A3 [...] ## Project Template diff --git a/challenge-079/tyler-wardhaugh/clojure/deps.edn b/challenge-079/tyler-wardhaugh/clojure/deps.edn index ea2660b255..236f47e5b1 100644 --- a/challenge-079/tyler-wardhaugh/clojure/deps.edn +++ b/challenge-079/tyler-wardhaugh/clojure/deps.edn @@ -10,5 +10,5 @@ :main-opts ["-m" "cognitect.test-runner" "-d" "test"]} :uberjar {:extra-deps {seancorfield/depstar {:mvn/version "1.0.94"}} - :main-opts ["-m" "hf.depstar.uberjar" "tw.weekly.c78.jar" - "-C" "-m" "tw.weekly.c78"]}}} + :main-opts ["-m" "hf.depstar.uberjar" "tw.weekly.c79.jar" + "-C" "-m" "tw.weekly.c79"]}}} diff --git a/challenge-079/tyler-wardhaugh/clojure/pom.xml b/challenge-079/tyler-wardhaugh/clojure/pom.xml index 05a218d4c8..9644c7aec7 100644 --- a/challenge-079/tyler-wardhaugh/clojure/pom.xml +++ b/challenge-079/tyler-wardhaugh/clojure/pom.xml @@ -2,11 +2,11 @@ 4.0.0 tw.weekly - tw.weekly.c78 + tw.weekly.c79 0.1.0-SNAPSHOT - tw.weekly.c78 + tw.weekly.c79 FIXME: my new application. - https://github.com/tw.weekly/tw.weekly.c78 + https://github.com/tw.weekly/tw.weekly.c79 Eclipse Public License @@ -19,9 +19,9 @@ - https://github.com/tw.weekly/tw.weekly.c78 - scm:git:git://github.com/tw.weekly/tw.weekly.c78.git - scm:git:ssh://git@github.com/tw.weekly/tw.weekly.c78.git + https://github.com/tw.weekly/tw.weekly.c79 + scm:git:git://github.com/tw.weekly/tw.weekly.c79.git + scm:git:ssh://git@github.com/tw.weekly/tw.weekly.c79.git HEAD diff --git a/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/core.clj b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/core.clj new file mode 100644 index 0000000000..0327a880fc --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/core.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c79.core + (:require [tw.weekly.c79.t1 :as t1]) + (:require [tw.weekly.c79.t2 :as t2]) + (:gen-class)) + +(defn -main + "Run all tasks" + [& _] + (println "Task #1") + (t1/-main) + (println "\n\nTask #2") + (t2/-main)) diff --git a/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj new file mode 100644 index 0000000000..5ff02af729 --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c79.t1 + (:require [clojure.pprint :refer [cl-format]]) + (:require [clojure.edn :as edn])) + +;;; Task description for TASK #1 › +;;; + + + +(defn -main + [& args] + ) diff --git a/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj new file mode 100644 index 0000000000..dc08a1106c --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj @@ -0,0 +1,10 @@ +(ns tw.weekly.c79.t2 + (:require [clojure.pprint :refer [cl-format]]) + (:require [clojure.edn :as edn])) + +;;; Task description for TASK #2 › +;;; + +(defn -main + [& args] + ) diff --git a/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj b/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj new file mode 100644 index 0000000000..6a3687df9f --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c79-test + (:require [clojure.test :refer [deftest is testing]] + [tw.weekly.c79.t1 :refer []] + [tw.weekly.c79.t2 :refer []])) + +(deftest task-1 + (testing "" + )) + +(deftest task-2 + (testing "" + )) -- cgit From 9dad8eb5c718146e406109092dc12aefc829886f Mon Sep 17 00:00:00 2001 From: Tyler Wardhaugh Date: Tue, 22 Sep 2020 16:12:16 -0700 Subject: Task 1 --- .../clojure/src/tw/weekly/c79/t1.clj | 25 ++++++++++++++++++---- .../clojure/test/tw/weekly/c79_test.clj | 7 +++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj index 5ff02af729..47140780d4 100644 --- a/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj +++ b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t1.clj @@ -1,12 +1,29 @@ (ns tw.weekly.c79.t1 - (:require [clojure.pprint :refer [cl-format]]) (:require [clojure.edn :as edn])) -;;; Task description for TASK #1 › -;;; +;;; Task description for TASK #1 › Count Set Bits +;You are given a positive number $N. +; +;Write a script to count the total numbrer of set bits of the binary representations of all numbers from 1 to $N and return $total_count_set_bit % 1000000007. +;;;; +(defn count-bits-to-n + "Count the '1' bits in the binary representation of all the integers [1..n]" + [n] + (let [xf (map #(Integer/bitCount %)) + source (range 1 (inc n))] + (transduce xf + source))) +(def big-num "The large number given in the task description to modulo against" + 1000000007N) + +(defn run + "Count the 1s and modulo" + [n] + (mod (count-bits-to-n n) big-num)) (defn -main + "Run Task 1 with a number N, defaulting to the first one given in the examples" [& args] - ) + (let [N (or (-> args first edn/read-string) 4)] + (format "%d" (biginteger (run N))))) diff --git a/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj b/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj index 6a3687df9f..30f26ba18c 100644 --- a/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj +++ b/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj @@ -1,11 +1,12 @@ (ns tw.weekly.c79-test (:require [clojure.test :refer [deftest is testing]] - [tw.weekly.c79.t1 :refer []] [tw.weekly.c79.t2 :refer []])) + [tw.weekly.c79.t1 :refer [run]] (deftest task-1 - (testing "" - )) + (testing "Task 1, Count Set Bits" + (is (= (run 4) 5) + (is (= (run 3) 4))))) (deftest task-2 (testing "" -- cgit From 9fd19396bf90b0e79dbf22cfca1428dc479b6a3c Mon Sep 17 00:00:00 2001 From: Tyler Wardhaugh Date: Tue, 22 Sep 2020 15:28:49 -0700 Subject: Task 2 --- challenge-079/tyler-wardhaugh/clojure/README.md | 11 +++++ challenge-079/tyler-wardhaugh/clojure/deps.edn | 3 +- challenge-079/tyler-wardhaugh/clojure/pom.xml | 5 ++ .../tyler-wardhaugh/clojure/resources/t2.test1.svg | 1 + .../tyler-wardhaugh/clojure/resources/t2.test2.svg | 1 + .../tyler-wardhaugh/clojure/resources/t2.test3.svg | 1 + .../tyler-wardhaugh/clojure/resources/t2.test4.svg | 1 + .../clojure/src/tw/weekly/c79/t2.clj | 57 ++++++++++++++++++++-- .../clojure/test/tw/weekly/c79_test.clj | 9 ++-- 9 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 challenge-079/tyler-wardhaugh/clojure/resources/t2.test1.svg create mode 100644 challenge-079/tyler-wardhaugh/clojure/resources/t2.test2.svg create mode 100644 challenge-079/tyler-wardhaugh/clojure/resources/t2.test3.svg create mode 100644 challenge-079/tyler-wardhaugh/clojure/resources/t2.test4.svg diff --git a/challenge-079/tyler-wardhaugh/clojure/README.md b/challenge-079/tyler-wardhaugh/clojure/README.md index b576ec7183..37d274beb5 100644 --- a/challenge-079/tyler-wardhaugh/clojure/README.md +++ b/challenge-079/tyler-wardhaugh/clojure/README.md @@ -21,6 +21,17 @@ Run Task #2 with input: $ clojure -m tw.weekly.c79.t2 A1 A2 A3 [...] +See SVG files in the `resources` directory for the histograms drawn for each of the tests for Task 2: + +![2 1 4 1 2 5](resources/t2.test1.svg "[2 1 4 1 2 5]") + +![3 1 3 1 1 5](resources/t2.test2.svg "[3 1 3 1 1 5]") + +![1 2 3 4 5 4 3 2 1](resources/t2.test3.svg "[1 2 3 4 5 4 3 2 1]") + +![4 1 3 1 2 5 10 5 7](resources/t2.test4.svg "[4 1 3 1 2 5 10 5 7]") + + ## Project Template I used Sean Corfield's clj-new to generate the project template diff --git a/challenge-079/tyler-wardhaugh/clojure/deps.edn b/challenge-079/tyler-wardhaugh/clojure/deps.edn index 236f47e5b1..988d683304 100644 --- a/challenge-079/tyler-wardhaugh/clojure/deps.edn +++ b/challenge-079/tyler-wardhaugh/clojure/deps.edn @@ -1,5 +1,6 @@ {:paths ["src" "resources"] - :deps {org.clojure/clojure {:mvn/version "1.10.1"}} + :deps {org.clojure/clojure {:mvn/version "1.10.1"} + metasoarous/oz {:mvn/version "1.6.0-alpha26"}} :aliases {:test {:extra-paths ["test"] :extra-deps {org.clojure/test.check {:mvn/version "1.0.0"}}} diff --git a/challenge-079/tyler-wardhaugh/clojure/pom.xml b/challenge-079/tyler-wardhaugh/clojure/pom.xml index 9644c7aec7..a5ef0fbd29 100644 --- a/challenge-079/tyler-wardhaugh/clojure/pom.xml +++ b/challenge-079/tyler-wardhaugh/clojure/pom.xml @@ -30,6 +30,11 @@ clojure 1.10.1 + + metasoarous + oz + 1.6.0-alpha26 + src diff --git a/challenge-079/tyler-wardhaugh/clojure/resources/t2.test1.svg b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test1.svg new file mode 100644 index 0000000000..c3f51d8d13 --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test1.svg @@ -0,0 +1 @@ +012345x012345Sum of y \ No newline at end of file diff --git a/challenge-079/tyler-wardhaugh/clojure/resources/t2.test2.svg b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test2.svg new file mode 100644 index 0000000000..1d37ffddb2 --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test2.svg @@ -0,0 +1 @@ +012345x012345Sum of y \ No newline at end of file diff --git a/challenge-079/tyler-wardhaugh/clojure/resources/t2.test3.svg b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test3.svg new file mode 100644 index 0000000000..0eab4070e1 --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test3.svg @@ -0,0 +1 @@ +0123456x01234Sum of y \ No newline at end of file diff --git a/challenge-079/tyler-wardhaugh/clojure/resources/t2.test4.svg b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test4.svg new file mode 100644 index 0000000000..64d9cdd5e6 --- /dev/null +++ b/challenge-079/tyler-wardhaugh/clojure/resources/t2.test4.svg @@ -0,0 +1 @@ +012345678x0246810Sum of y \ No newline at end of file diff --git a/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj index dc08a1106c..45513901c1 100644 --- a/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj +++ b/challenge-079/tyler-wardhaugh/clojure/src/tw/weekly/c79/t2.clj @@ -1,10 +1,59 @@ (ns tw.weekly.c79.t2 - (:require [clojure.pprint :refer [cl-format]]) - (:require [clojure.edn :as edn])) + (:require [clojure.edn :as edn]) + (:require [oz.core :as oz])) -;;; Task description for TASK #2 › +;;; Task description for TASK #2 › Trapped Rain Water +; You are given an array of positive numbers @N. +; +; Write a script to represent it as Histogram Chart and find out how much water it can trap. +; +; Example 1: +; Input: @N = (2, 1, 4, 1, 2, 5) +; The histogram representation of the given array is as below. +; 5 # +; 4 # # +; 3 # # +; 2 # # # # +; 1 # # # # # # +; _ _ _ _ _ _ _ +; 2 1 4 1 2 5 ;;; +(defn splits + "Partition the input by splitting it at each index, ensuring partitions contain at least one element." + [coll] + (map #(split-at % coll) (range 1 (dec (count coll))))) + +(defn calculate-pools + "Returns a sequence of pools, which are the amount of water 'units' that can be held at the inner elements of the coll, when viewed as a histogram." + [coll] + (let [neighboring-maxes (fn [[l [c & r]]] [(apply max l) c (apply max r)]) + to-water (fn [[l c r]] (max (- (min l r) c) 0))] + (->> (splits coll) + (eduction (map neighboring-maxes) (map to-water))))) + +(defn capacity + "Calculates the total capacity of the pools" + [pools] + (reduce + 0 pools)) + +(defn draw-histogram + "Vizualize the histogram, using Oz (which uses Vega-Lite & Vega)" + ([coll] (draw-histogram coll (calculate-pools coll))) + ([coll pools] (let [make-hashes (fn [x land water] (list (hash-map :x x :y land :c "green") (hash-map :x x :y water :c "blue"))) + values (mapcat make-hashes (range) coll (concat [0] pools [0]))] + (oz/view! {:data {:values values} + :encoding {:x {:field :x :type "ordinal"} + :y {:field :y :type "quantitative" :aggregate "sum"} + :color {:field :c + :type "nominal" + :scale nil}} + :mark "bar"})))) + (defn -main [& args] - ) + (let [N (or (some->> args (map edn/read-string)) [2 1 4 1 2 5]) + pools (calculate-pools N)] + (println (capacity pools)) + (oz/start-server!) + (draw-histogram N pools))) diff --git a/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj b/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj index 30f26ba18c..2b0efafdfc 100644 --- a/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj +++ b/challenge-079/tyler-wardhaugh/clojure/test/tw/weekly/c79_test.clj @@ -1,7 +1,7 @@ (ns tw.weekly.c79-test (:require [clojure.test :refer [deftest is testing]] - [tw.weekly.c79.t2 :refer []])) [tw.weekly.c79.t1 :refer [run]] + [tw.weekly.c79.t2 :refer [calculate-pools capacity]])) (deftest task-1 (testing "Task 1, Count Set Bits" @@ -9,5 +9,8 @@ (is (= (run 3) 4))))) (deftest task-2 - (testing "" - )) + (testing "Task 2, Trapped Rain Water" + (is (= (capacity (calculate-pools [2 1 4 1 2 5])) 6)) + (is (= (capacity (calculate-pools [3 1 3 1 1 5])) 6)) + (is (= (capacity (calculate-pools [1 2 3 4 5 4 3 2 1])) 0)) + (is (= (capacity (calculate-pools [4 1 3 1 2 5 10 5 7])) 11)))) -- cgit