aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-11-06 22:05:36 +0000
committerGitHub <noreply@github.com>2021-11-06 22:05:36 +0000
commitf2e277bdb5366c85046ec32f84998662b1c6d768 (patch)
tree453706cda72b90a1414de3e730cbb70d4c3445a8
parentf9c29214784983f3fbdf819cf72b4c49f0a5c42f (diff)
parent401f7d3d4e03125f247ff7246d78ed81415e327d (diff)
downloadperlweeklychallenge-club-f2e277bdb5366c85046ec32f84998662b1c6d768.tar.gz
perlweeklychallenge-club-f2e277bdb5366c85046ec32f84998662b1c6d768.tar.bz2
perlweeklychallenge-club-f2e277bdb5366c85046ec32f84998662b1c6d768.zip
Merge pull request #5170 from tylerw/tw/challenge-137
Challenge 137
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/README.md12
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/bb.edn22
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/deps.edn3
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/pom.xml8
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/core.clj12
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t1.cljc44
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t2.clj31
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t1_test.clj12
-rw-r--r--challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t2_test.clj14
9 files changed, 135 insertions, 23 deletions
diff --git a/challenge-137/tyler-wardhaugh/clojure/README.md b/challenge-137/tyler-wardhaugh/clojure/README.md
index d05825bedb..371f142e4e 100644
--- a/challenge-137/tyler-wardhaugh/clojure/README.md
+++ b/challenge-137/tyler-wardhaugh/clojure/README.md
@@ -1,7 +1,7 @@
-# tw.weekly.c136
+# tw.weekly.c137
-The Weekly Challenge - #136 - Tyler Wardhaugh
+The Weekly Challenge - #137 - Tyler Wardhaugh
## Usage
@@ -9,7 +9,7 @@ Clojure ([installation instructions](https://clojure.org/guides/getting_started#
Run the project directly (shows default output from both tasks):
- $ clojure -M -m tw.weekly.c136.core
+ $ clojure -M -m tw.weekly.c137.core
# ... or ...
$ bb run both
@@ -21,13 +21,13 @@ Run the project's tests (which are samples from the task descriptions):
Run Task #1 with input
- $ clojure -M -m tw.weekly.c136.t1 M N
+ $ clojure -M -m tw.weekly.c137.t1
# ... or ...
- $ bb run task-1 M N
+ $ bb run task-1
Run Task #2 with input:
- $ clojure -M -m tw.weekly.c136.t2 N
+ $ clojure -M -m tw.weekly.c137.t2 N
# ... or ...
$ bb run task-2 N
diff --git a/challenge-137/tyler-wardhaugh/clojure/bb.edn b/challenge-137/tyler-wardhaugh/clojure/bb.edn
index 2299ced5c9..f0892047d3 100644
--- a/challenge-137/tyler-wardhaugh/clojure/bb.edn
+++ b/challenge-137/tyler-wardhaugh/clojure/bb.edn
@@ -21,14 +21,16 @@
(-> file get-first-form second str)))
(defn run-task
- [task args]
- (let [clj-options (format "-M -m %s " (get-task-ns task))]
- (apply clojure clj-options args)))
+ ([task args] (run-task task args (get-task-ns task)))
+ ([task args task-ns]
+ (let [clj-options (format "-M -m %s " task-ns)]
+ (apply clojure clj-options args))))
(defn run-task-bb
- [task args]
- (let [bb-cmd (format "bb -m %s " (get-task-ns task))]
- (apply shell bb-cmd args))))
+ ([task args] (run-task-bb task args (get-task-ns task)))
+ ([task args task-ns]
+ (let [bb-cmd (format "bb -m %s " task-ns)]
+ (apply shell bb-cmd args)))))
clean {:doc "Clean out temporary files"
:task (run! fs/delete-tree
@@ -61,18 +63,16 @@
c**** {:doc "CHALLENGE TASKS"}
task-1 {:doc "Run Task 1 (via clojure)"
- :task (run-task :t1 *command-line-args*)}
+ :task (run-task :t1 *command-line-args* "tw.weekly.c137.t1")}
task-1-bb {:doc "Run Task 1 (via Babashka)"
- :task (run-task-bb :t1 *command-line-args*)}
+ :task (run-task-bb :t1 *command-line-args* "tw.weekly.c137.t1")}
task-2 {:doc "Run Task 2 (via clojure)"
:task (run-task :t2 *command-line-args*)}
task-2-bb {:doc "Run Task 2 (via Babashka)"
- :task (binding [*out* *err*]
- (println "error: can't run Task 2 via Babashka because it depends on some incompatible libraries.")
- (System/exit 1))}
+ :task (run-task-bb :t2 *command-line-args*)}
both {:doc "Run both tasks (via clojure)"
:task (do
diff --git a/challenge-137/tyler-wardhaugh/clojure/deps.edn b/challenge-137/tyler-wardhaugh/clojure/deps.edn
index 99b46a9e15..5b1400b27e 100644
--- a/challenge-137/tyler-wardhaugh/clojure/deps.edn
+++ b/challenge-137/tyler-wardhaugh/clojure/deps.edn
@@ -1,6 +1,5 @@
{:paths ["src" "resources"]
- :deps {org.clojure/clojure {:mvn/version "1.10.3"}
- org.clojure/math.combinatorics {:mvn/version "0.1.6"}}
+ :deps {org.clojure/clojure {:mvn/version "1.10.3"}}
:aliases
{:test {:extra-paths ["test"]
:extra-deps {org.clojure/test.check {:mvn/version "1.1.0"}
diff --git a/challenge-137/tyler-wardhaugh/clojure/pom.xml b/challenge-137/tyler-wardhaugh/clojure/pom.xml
index fbbe52d202..03a691f300 100644
--- a/challenge-137/tyler-wardhaugh/clojure/pom.xml
+++ b/challenge-137/tyler-wardhaugh/clojure/pom.xml
@@ -2,11 +2,11 @@
<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.c136</artifactId>
+ <artifactId>tw.weekly.c137</artifactId>
<version>0.1.0-SNAPSHOT</version>
- <name>tw.weekly.c136</name>
- <description>Challenge #136</description>
- <url>https://github.com/tw.weekly/tw.weekly.c136</url>
+ <name>tw.weekly.c137</name>
+ <description>Challenge #137</description>
+ <url>https://github.com/tw.weekly/tw.weekly.c137</url>
<licenses>
<license>
<name>Eclipse Public License</name>
diff --git a/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/core.clj b/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/core.clj
new file mode 100644
index 0000000000..53ca78eb2c
--- /dev/null
+++ b/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/core.clj
@@ -0,0 +1,12 @@
+(ns tw.weekly.c137.core
+ (:require [tw.weekly.c137.t1 :as t1])
+ (:require [tw.weekly.c137.t2 :as t2])
+ (:gen-class))
+
+(defn -main
+ "Run all tasks"
+ [& _]
+ (println "Task #1:")
+ (t1/-main)
+ (println "\nTask #2:")
+ (t2/-main))
diff --git a/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t1.cljc b/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t1.cljc
new file mode 100644
index 0000000000..a08e5444a9
--- /dev/null
+++ b/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t1.cljc
@@ -0,0 +1,44 @@
+(ns tw.weekly.c137.t1
+ (:require [clojure.pprint :refer [cl-format]])
+ #?(:bb (:import [])
+ :clj (:import [java.time LocalDate]
+ [java.time.temporal WeekFields])))
+;;;
+; Task description for TASK #1 › Long Year
+;;;
+
+; define long-year-temporal?
+#?(:bb
+ (defn long-year-temporal? [_]
+ (throw (Exception. "java.time.temporal not supported on Babashka")))
+
+ :clj
+ (let [week-of-year (.weekOfYear (WeekFields/ISO))]
+ (defn long-year-temporal?
+ "Is year long? (Uses Java's temporal library to get week number.)"
+ [year]
+ (-> (LocalDate/of year 12 28)
+ (.get week-of-year)
+ (= 53)))))
+
+; define long-year-manual?
+; source: https://en.wikipedia.org/wiki/ISO_week_date#Weeks_per_year
+(let [p (fn [year]
+ (-> (+ year
+ (quot year 4)
+ (* -1 (quot year 100))
+ (quot year 400))
+ (mod 7)))]
+ (defn long-year-manual?
+ "Is year long? (Uses the method described in Wikipedia.)"
+ [year]
+ (or (= (p year) 4) (= (p (dec year)) 3))))
+
+; choose an implementation based on our runtime (Clojure JVM or Babashka)
+(def long-year? #?(:bb long-year-manual? :clj long-year-temporal?))
+
+(defn -main
+ "Run Task 1 with a given input M and N, defaulting to the first example from
+ the task description."
+ [& _]
+ (cl-format true "~{~a~^, ~}~%" (filter long-year? (range 1900 2101))))
diff --git a/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t2.clj b/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t2.clj
new file mode 100644
index 0000000000..8f288e825c
--- /dev/null
+++ b/challenge-137/tyler-wardhaugh/clojure/src/tw/weekly/c137/t2.clj
@@ -0,0 +1,31 @@
+(ns tw.weekly.c137.t2
+ (:require [clojure.edn :as edn]
+ [clojure.string :as str]))
+
+;;;
+; Task description for TASK #2 › Lychrel Number
+;;;
+(def DEFAULT-INPUT [56])
+(def MAX-TIMES 500)
+(def MAX-NUM 10000000)
+
+(defn flip
+ [n]
+ (Integer/parseInt (-> n str str/reverse)))
+
+(defn lychrel
+ [n]
+ (loop [n n
+ times 1]
+ (cond
+ (>= times MAX-TIMES) 1
+ (>= n MAX-NUM) 1
+ (= n (flip n)) 0
+ :else (recur (+ n (flip n)) (inc times)))))
+
+(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 (lychrel N) 1 0))))
diff --git a/challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t1_test.clj b/challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t1_test.clj
new file mode 100644
index 0000000000..a083ce82f1
--- /dev/null
+++ b/challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t1_test.clj
@@ -0,0 +1,12 @@
+(ns tw.weekly.c137.t1-test
+ (:require [clojure.test :refer [deftest is testing]]
+ [tw.weekly.c137.t1 :refer [long-year-temporal? long-year-manual?]]))
+
+(deftest examples
+ (testing "Examples from description"
+ (let [source (range 1900 2101)]
+ (is (= (sequence (filter long-year-temporal?) source)
+ (sequence (filter long-year-manual?) source)
+ [1903 1908 1914 1920 1925 1931 1936 1942 1948 1953 1959 1964 1970
+ 1976 1981 1987 1992 1998 2004 2009 2015 2020 2026 2032 2037 2043
+ 2048 2054 2060 2065 2071 2076 2082 2088 2093 2099])))))
diff --git a/challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t2_test.clj b/challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t2_test.clj
new file mode 100644
index 0000000000..d61252832a
--- /dev/null
+++ b/challenge-137/tyler-wardhaugh/clojure/test/tw/weekly/c137/t2_test.clj
@@ -0,0 +1,14 @@
+(ns tw.weekly.c137.t2-test
+ (:require [clojure.test :refer [deftest is testing]]
+ [tw.weekly.c137.t2 :refer [lychrel]]))
+
+(deftest examples
+ (testing "Examples from description"
+ (is (= 0 (lychrel 56)))
+ (is (= 0 (lychrel 57)))
+ (is (= 0 (lychrel 59)))))
+
+(deftest maximum
+ (testing "Numbers that exceed our ceiling"
+ (is (= 1 (lychrel 998)))
+ (is (= 1 (lychrel 196)))))