aboutsummaryrefslogtreecommitdiff
path: root/challenge-072/tyler-wardhaugh/clojure
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-072/tyler-wardhaugh/clojure')
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/.gitignore16
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/LICENSE214
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/README.md35
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/deps.edn15
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/pom.xml48
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/resources/.keep0
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/resources/input.txt100
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/core.clj12
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t1.clj22
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t2.clj18
-rw-r--r--challenge-072/tyler-wardhaugh/clojure/test/tw/weekly/c72_test.clj16
11 files changed, 496 insertions, 0 deletions
diff --git a/challenge-072/tyler-wardhaugh/clojure/.gitignore b/challenge-072/tyler-wardhaugh/clojure/.gitignore
new file mode 100644
index 0000000000..7f0a72a26b
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/.gitignore
@@ -0,0 +1,16 @@
+*.class
+*.jar
+.clj-kondo/
+.hg/
+.hgignore
+.lsp/
+.rebel_readline_history
+/.cpcache
+/.lein-*
+/.lsp/
+/.nrepl-history
+/.nrepl-port
+/checkouts
+/classes
+/dependencies.pdf
+/target
diff --git a/challenge-072/tyler-wardhaugh/clojure/LICENSE b/challenge-072/tyler-wardhaugh/clojure/LICENSE
new file mode 100644
index 0000000000..7689f30efd
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/LICENSE
@@ -0,0 +1,214 @@
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and are
+distributed by that particular Contributor. A Contribution 'originates' from
+a Contributor if it was added to the Program by such Contributor itself or
+anyone acting on such Contributor's behalf. Contributions do not include
+additions to the Program which: (i) are separate modules of software
+distributed in conjunction with the Program under their own license
+agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free copyright license to
+reproduce, prepare derivative works of, publicly display, publicly perform,
+distribute and sublicense the Contribution of such Contributor, if any, and
+such derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free patent license under
+Licensed Patents to make, use, sell, offer to sell, import and otherwise
+transfer the Contribution of such Contributor, if any, in source code and
+object code form. This patent license shall apply to the combination of the
+Contribution and the Program if, at the time the Contribution is added by the
+Contributor, such addition of the Contribution causes such combination to be
+covered by the Licensed Patents. The patent license shall not apply to any
+other combinations which include the Contribution. No hardware per se is
+licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses
+to its Contributions set forth herein, no assurances are provided by any
+Contributor that the Program does not infringe the patent or other
+intellectual property rights of any other entity. Each Contributor disclaims
+any liability to Recipient for claims brought by any other entity based on
+infringement of intellectual property rights or otherwise. As a condition to
+exercising the rights and licenses granted hereunder, each Recipient hereby
+assumes sole responsibility to secure any other intellectual property rights
+needed, if any. For example, if a third party patent license is required to
+allow Recipient to distribute the Program, it is Recipient's responsibility
+to acquire that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright license
+set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under
+its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and consequential
+damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are offered
+by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable manner on
+or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within
+the Program.
+
+Each Contributor must identify itself as the originator of its Contribution,
+if any, in a manner that reasonably allows subsequent Recipients to identify
+the originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a
+manner which does not create potential liability for other Contributors.
+Therefore, if a Contributor includes the Program in a commercial product
+offering, such Contributor ("Commercial Contributor") hereby agrees to defend
+and indemnify every other Contributor ("Indemnified Contributor") against any
+losses, damages and costs (collectively "Losses") arising from claims,
+lawsuits and other legal actions brought by a third party against the
+Indemnified Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the Program in
+a commercial product offering. The obligations in this section do not apply
+to any claims or Losses relating to any actual or alleged intellectual
+property infringement. In order to qualify, an Indemnified Contributor must:
+a) promptly notify the Commercial Contributor in writing of such claim, and
+b) allow the Commercial Contributor tocontrol, and cooperate with the
+Commercial Contributor in, the defense and any related settlement
+negotiations. The Indemnified Contributor may participate in any such claim
+at its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If
+that Commercial Contributor then makes performance claims, or offers
+warranties related to Product X, those performance claims and warranties are
+such Commercial Contributor's responsibility alone. Under this section, the
+Commercial Contributor would have to defend claims against the other
+Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON
+AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
+EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
+CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
+PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the
+appropriateness of using and distributing the Program and assumes all risks
+associated with its exercise of rights under this Agreement , including but
+not limited to the risks and costs of program errors, compliance with
+applicable laws, damage to or loss of data, programs or equipment, and
+unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
+LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of the
+remainder of the terms of this Agreement, and without further action by the
+parties hereto, such provision shall be reformed to the minimum extent
+necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Program itself
+(excluding combinations of the Program with other software or hardware)
+infringes such Recipient's patent(s), then such Recipient's rights granted
+under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to
+comply with any of the material terms or conditions of this Agreement and
+does not cure such failure in a reasonable period of time after becoming
+aware of such noncompliance. If all Recipient's rights under this Agreement
+terminate, Recipient agrees to cease use and distribution of the Program as
+soon as reasonably practicable. However, Recipient's obligations under this
+Agreement and any licenses granted by Recipient relating to the Program shall
+continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be
+modified in the following manner. The Agreement Steward reserves the right to
+publish new versions (including revisions) of this Agreement from time to
+time. No one other than the Agreement Steward has the right to modify this
+Agreement. The Eclipse Foundation is the initial Agreement Steward. The
+Eclipse Foundation may assign the responsibility to serve as the Agreement
+Steward to a suitable separate entity. Each new version of the Agreement will
+be given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly
+stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
+licenses to the intellectual property of any Contributor under this
+Agreement, whether expressly, by implication, estoppel or otherwise. All
+rights in the Program not expressly granted under this Agreement are
+reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year
+after the cause of action arose. Each party waives its rights to a jury trial
+in any resulting litigation.
diff --git a/challenge-072/tyler-wardhaugh/clojure/README.md b/challenge-072/tyler-wardhaugh/clojure/README.md
new file mode 100644
index 0000000000..fe86c75e5b
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/README.md
@@ -0,0 +1,35 @@
+# tw.weekly.c72
+
+
+The Weekly Challenge - #072 - Tyler Wardhaugh
+
+## Usage
+
+Run the project directly (shows default output from both tasks):
+
+ $ clojure -m tw.weekly.c72.core
+
+Run the project's tests (which are samples from the task descriptions):
+
+ $ clojure -A:test:runner
+
+Run Task #1 with input
+
+ $ clojure -m tw.weekly.c72.t1 N
+
+Run Task #2 with input:
+
+ $ clojure -m tw.weekly.c72.t2 FILE A B
+
+## Project Template
+
+I used Sean Corfield's clj-new to generate the project template
+
+See [seancorfield/clj-new: Generate new projects based on clj, Boot, or Leiningen Templates!](https://github.com/seancorfield/clj-new) for more information.
+
+## License
+
+Copyright © 2020 Tyler Wardhaugh
+
+Distributed under the Eclipse Public License either version 1.0 or (at
+your option) any later version.
diff --git a/challenge-072/tyler-wardhaugh/clojure/deps.edn b/challenge-072/tyler-wardhaugh/clojure/deps.edn
new file mode 100644
index 0000000000..1e2252e193
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/deps.edn
@@ -0,0 +1,15 @@
+{:paths ["src" "resources"]
+ :deps {org.clojure/clojure {:mvn/version "1.10.1"}
+ pjstadig/reducible-stream {:mvn/version "0.1.5"}}
+ :aliases
+ {:test {:extra-paths ["test"]
+ :extra-deps {org.clojure/test.check {:mvn/version "1.0.0"}}}
+ :runner
+ {:extra-deps {com.cognitect/test-runner
+ {:git/url "https://github.com/cognitect-labs/test-runner"
+ :sha "f7ef16dc3b8332b0d77bc0274578ad5270fbfedd"}}
+ :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.c72.jar"
+ "-C" "-m" "tw.weekly.c72"]}}}
diff --git a/challenge-072/tyler-wardhaugh/clojure/pom.xml b/challenge-072/tyler-wardhaugh/clojure/pom.xml
new file mode 100644
index 0000000000..f624b5b60e
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>tw.weekly</groupId>
+ <artifactId>tw.weekly.c72</artifactId>
+ <version>0.1.0-SNAPSHOT</version>
+ <name>tw.weekly.c72</name>
+ <description>Challenge 072 in Clojure</description>
+ <licenses>
+ <license>
+ <name>Eclipse Public License</name>
+ <url>http://www.eclipse.org/legal/epl-v10.html</url>
+ </license>
+ </licenses>
+ <developers>
+ <developer>
+ <name>Tyler Wardhaugh</name>
+ </developer>
+ </developers>
+ <dependencies>
+ <dependency>
+ <groupId>org.clojure</groupId>
+ <artifactId>clojure</artifactId>
+ <version>1.10.1</version>
+ </dependency>
+ <dependency>
+ <groupId>pjstadig</groupId>
+ <artifactId>reducible-stream</artifactId>
+ <version>0.1.5</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <sourceDirectory>src</sourceDirectory>
+ </build>
+ <repositories>
+ <repository>
+ <id>clojars</id>
+ <url>https://repo.clojars.org/</url>
+ </repository>
+ </repositories>
+ <distributionManagement>
+ <repository>
+ <id>clojars</id>
+ <name>Clojars repository</name>
+ <url>https://clojars.org/repo</url>
+ </repository>
+ </distributionManagement>
+</project>
diff --git a/challenge-072/tyler-wardhaugh/clojure/resources/.keep b/challenge-072/tyler-wardhaugh/clojure/resources/.keep
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/resources/.keep
diff --git a/challenge-072/tyler-wardhaugh/clojure/resources/input.txt b/challenge-072/tyler-wardhaugh/clojure/resources/input.txt
new file mode 100644
index 0000000000..e5a15512e0
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/resources/input.txt
@@ -0,0 +1,100 @@
+L1
+L2
+L3
+L4
+L5
+L6
+L7
+L8
+L9
+L10
+L11
+L12
+L13
+L14
+L15
+L16
+L17
+L18
+L19
+L20
+L21
+L22
+L23
+L24
+L25
+L26
+L27
+L28
+L29
+L30
+L31
+L32
+L33
+L34
+L35
+L36
+L37
+L38
+L39
+L40
+L41
+L42
+L43
+L44
+L45
+L46
+L47
+L48
+L49
+L50
+L51
+L52
+L53
+L54
+L55
+L56
+L57
+L58
+L59
+L60
+L61
+L62
+L63
+L64
+L65
+L66
+L67
+L68
+L69
+L70
+L71
+L72
+L73
+L74
+L75
+L76
+L77
+L78
+L79
+L80
+L81
+L82
+L83
+L84
+L85
+L86
+L87
+L88
+L89
+L90
+L91
+L92
+L93
+L94
+L95
+L96
+L97
+L98
+L99
+L100
diff --git a/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/core.clj b/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/core.clj
new file mode 100644
index 0000000000..b7d09ae991
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/core.clj
@@ -0,0 +1,12 @@
+(ns tw.weekly.c72.core
+ (:require [tw.weekly.c72.t1 :as t1])
+ (:require [tw.weekly.c72.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-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t1.clj b/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t1.clj
new file mode 100644
index 0000000000..daefe5c833
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t1.clj
@@ -0,0 +1,22 @@
+(ns tw.weekly.c72.t1
+ (:require [clojure.pprint :refer [cl-format]])
+ (:require [clojure.edn :as edn]))
+
+(defn fact
+ "Factorial"
+ [n]
+ (->> n inc (range 1) (reduce *)))
+
+(defn trailing-zeros
+ "Count the trailing 0s in a number"
+ [n]
+ (let [[d cnt] (->> n str reverse (partition-by #(= \0 %)) first ((juxt first count)))]
+ (if (= d \0) cnt 0)))
+
+(defn -main
+ "Run Task 1 with a number N, defaulting to 10"
+ [& args]
+ (let [n (or (some-> args first edn/read-string) 10)
+ n! (fact n)
+ zs (trailing-zeros n!)]
+ (cl-format true "~a! = ~a has ~a trailing zero~:p" n n! zs)))
diff --git a/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t2.clj b/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t2.clj
new file mode 100644
index 0000000000..072a02ef1e
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/src/tw/weekly/c72/t2.clj
@@ -0,0 +1,18 @@
+(ns tw.weekly.c72.t2
+ (:require [clojure.java.io :as io])
+ (:require [clojure.edn :as edn])
+ (:require [pjstadig.reducible-stream :refer [decode-lines!]]))
+
+(defn lines-from
+ "Produce a range of lines from a file"
+ [file a b]
+ (let [xf (comp (drop (dec a)) (take (- b a -1)))
+ source (decode-lines! file)]
+ (sequence xf source)))
+
+(defn -main
+ "Run Task 2 with a file and range of lines to print, defaulting to the first example in the task description"
+ [& args]
+ (let [file (or (some-> args first io/file) (io/resource "input.txt"))
+ [a b] (or (some->> args (drop 1) (take 2) (map edn/read-string)) [4 12])]
+ (dorun (map println (lines-from file a b)))))
diff --git a/challenge-072/tyler-wardhaugh/clojure/test/tw/weekly/c72_test.clj b/challenge-072/tyler-wardhaugh/clojure/test/tw/weekly/c72_test.clj
new file mode 100644
index 0000000000..950b030fe8
--- /dev/null
+++ b/challenge-072/tyler-wardhaugh/clojure/test/tw/weekly/c72_test.clj
@@ -0,0 +1,16 @@
+(ns tw.weekly.c72-test
+ (:require [clojure.test :refer [are deftest is testing]]
+ [clojure.java.io :as io]
+ [tw.weekly.c72.t1 :refer [fact trailing-zeros]]
+ [tw.weekly.c72.t2 :refer [lines-from]]))
+
+(deftest task-1
+ (testing "Task 1, Trailing Zeroes"
+ (are [n e] (= (trailing-zeros (fact n)) e)
+ 10 2
+ 7 1
+ 4 0)))
+
+(deftest task-2
+ (testing "Task 2, Lines Range"
+ (is (= (list "L1" "L2" "L3") (lines-from (io/resource "input.txt") 1 3)))))