aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Wardhaugh <twardhaugh@cap-rx.com>2021-10-15 12:39:43 -0700
committerTyler Wardhaugh <twardhaugh@cap-rx.com>2021-10-15 12:39:43 -0700
commitd64fa3b6f38828d06312399c58a857a4e2190bec (patch)
treeb7acbe0a55741233bd80bc00a3ea5fd03049ae76
parenta4d967426cafe6428633c0c52ecc0459dae6b338 (diff)
downloadperlweeklychallenge-club-d64fa3b6f38828d06312399c58a857a4e2190bec.tar.gz
perlweeklychallenge-club-d64fa3b6f38828d06312399c58a857a4e2190bec.tar.bz2
perlweeklychallenge-club-d64fa3b6f38828d06312399c58a857a4e2190bec.zip
Ch134 (Clojure): Task 1
-rw-r--r--challenge-134/tyler-wardhaugh/clojure/README.md2
-rw-r--r--challenge-134/tyler-wardhaugh/clojure/bb.edn4
-rw-r--r--challenge-134/tyler-wardhaugh/clojure/deps.edn3
-rw-r--r--challenge-134/tyler-wardhaugh/clojure/pom.xml5
-rw-r--r--challenge-134/tyler-wardhaugh/clojure/src/tw/weekly/c134/t1.clj32
-rw-r--r--challenge-134/tyler-wardhaugh/clojure/test/tw/weekly/c134/t1_test.clj11
6 files changed, 48 insertions, 9 deletions
diff --git a/challenge-134/tyler-wardhaugh/clojure/README.md b/challenge-134/tyler-wardhaugh/clojure/README.md
index d6703ce23a..e63c5ea04a 100644
--- a/challenge-134/tyler-wardhaugh/clojure/README.md
+++ b/challenge-134/tyler-wardhaugh/clojure/README.md
@@ -22,8 +22,6 @@ Run the project's tests (which are samples from the task descriptions):
Run Task #1 with input
$ clojure -M -m tw.weekly.c134.t1 N
- # ... or ...
- $ bb run task-1 N
Run Task #2 with input:
diff --git a/challenge-134/tyler-wardhaugh/clojure/bb.edn b/challenge-134/tyler-wardhaugh/clojure/bb.edn
index 69331331eb..129b8ba62c 100644
--- a/challenge-134/tyler-wardhaugh/clojure/bb.edn
+++ b/challenge-134/tyler-wardhaugh/clojure/bb.edn
@@ -64,7 +64,9 @@
:task (run-task :t1 *command-line-args*)}
task-1-bb {:doc "Run Task 1 (via Babashka)"
- :task (run-task-bb :t1 *command-line-args*)}
+ :task (binding [*out* *err*]
+ (println "error: can't run Task 1 via Babashka because it depends on some incompatible libraries.")
+ (System/exit 1))}
task-2 {:doc "Run Task 2 (via clojure)"
:task (run-task :t2 *command-line-args*)}
diff --git a/challenge-134/tyler-wardhaugh/clojure/deps.edn b/challenge-134/tyler-wardhaugh/clojure/deps.edn
index 5b1400b27e..99b46a9e15 100644
--- a/challenge-134/tyler-wardhaugh/clojure/deps.edn
+++ b/challenge-134/tyler-wardhaugh/clojure/deps.edn
@@ -1,5 +1,6 @@
{:paths ["src" "resources"]
- :deps {org.clojure/clojure {:mvn/version "1.10.3"}}
+ :deps {org.clojure/clojure {:mvn/version "1.10.3"}
+ org.clojure/math.combinatorics {:mvn/version "0.1.6"}}
:aliases
{:test {:extra-paths ["test"]
:extra-deps {org.clojure/test.check {:mvn/version "1.1.0"}
diff --git a/challenge-134/tyler-wardhaugh/clojure/pom.xml b/challenge-134/tyler-wardhaugh/clojure/pom.xml
index 3a14ee2365..85869d7a3f 100644
--- a/challenge-134/tyler-wardhaugh/clojure/pom.xml
+++ b/challenge-134/tyler-wardhaugh/clojure/pom.xml
@@ -24,6 +24,11 @@
<artifactId>clojure</artifactId>
<version>1.10.3</version>
</dependency>
+ <dependency>
+ <groupId>org.clojure</groupId>
+ <artifactId>math.combinatorics</artifactId>
+ <version>0.1.6</version>
+ </dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
diff --git a/challenge-134/tyler-wardhaugh/clojure/src/tw/weekly/c134/t1.clj b/challenge-134/tyler-wardhaugh/clojure/src/tw/weekly/c134/t1.clj
index 4ae7353a3c..553d738f58 100644
--- a/challenge-134/tyler-wardhaugh/clojure/src/tw/weekly/c134/t1.clj
+++ b/challenge-134/tyler-wardhaugh/clojure/src/tw/weekly/c134/t1.clj
@@ -1,14 +1,38 @@
(ns tw.weekly.c134.t1
- (:require [clojure.edn :as edn]))
+ (:require [clojure.edn :as edn]
+ [clojure.pprint :refer [cl-format]]
+ [clojure.math.combinatorics :as combo]))
;;;
-; Task description for TASK #1 ›
+; Task description for TASK #1 › Pandigital Numbers
;;;
-(def DEFAULT-INPUT [])
+(def DEFAULT-INPUT [5])
+(def FIRST-PANDIGITAL 1023456789)
+(def MAX-FACTORIAL 8)
+
+(def factorials (map #(reduce * (range % 1 -1)) (range (inc MAX-FACTORIAL))))
+
+(let [pan (->> FIRST-PANDIGITAL str (mapv #(Character/digit % 10)))
+ panlen (count pan)]
+ (defn split-pandigital
+ [n]
+ (-> (fn [_ i]
+ (when (> (nth factorials i) n)
+ (reduced [(apply str (subvec pan 0 (- panlen i)))
+ (subvec pan (- panlen i))])))
+ (reduce (range panlen)))))
+
+(defn pandigitals
+ [n]
+ {:pre [(<= n (last factorials))]}
+ (let [[head tails] (split-pandigital n)
+ source (combo/permutations tails)
+ xf (comp (map (partial apply str head)) (take n))]
+ (sequence xf source)))
(defn -main
"Run Task 1 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)]
- ))
+ (cl-format true "~{~a~%~}" (pandigitals N))))
diff --git a/challenge-134/tyler-wardhaugh/clojure/test/tw/weekly/c134/t1_test.clj b/challenge-134/tyler-wardhaugh/clojure/test/tw/weekly/c134/t1_test.clj
index 8f99c3f59a..f0c541e6dc 100644
--- a/challenge-134/tyler-wardhaugh/clojure/test/tw/weekly/c134/t1_test.clj
+++ b/challenge-134/tyler-wardhaugh/clojure/test/tw/weekly/c134/t1_test.clj
@@ -1,3 +1,12 @@
(ns tw.weekly.c134.t1-test
(:require [clojure.test :refer [deftest is testing]]
- [tw.weekly.c134.t1 :refer []]))
+ [tw.weekly.c134.t1 :refer [pandigitals]]))
+
+(deftest examples
+ (testing "Examples from description"
+ (is (= ["1023456789"
+ "1023456798"
+ "1023456879"
+ "1023456897"
+ "1023456978"]
+ (pandigitals 5)))))