aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-11-11 08:28:24 +0000
committerGitHub <noreply@github.com>2020-11-11 08:28:24 +0000
commitc51c6255852b1969e1e68cb24157a14e5ac0d209 (patch)
tree171d65ef945674e5ac7d51e07eb5b529299eb3b8
parentc8585cd64f49481e24083bfe6d58cee7411a46ca (diff)
parent85cf6af99b0143653e895fdd5b340ac782498f0e (diff)
downloadperlweeklychallenge-club-c51c6255852b1969e1e68cb24157a14e5ac0d209.tar.gz
perlweeklychallenge-club-c51c6255852b1969e1e68cb24157a14e5ac0d209.tar.bz2
perlweeklychallenge-club-c51c6255852b1969e1e68cb24157a14e5ac0d209.zip
Merge pull request #2744 from tylerw/tw/challenge-086
Challenge 086
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/README.md10
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/deps.edn8
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/pom.xml24
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/resources/sudoku-19
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/resources/sudoku-29
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/resources/sudoku-312
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/core.clj12
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t1.clj24
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t2.clj41
-rw-r--r--challenge-086/tyler-wardhaugh/clojure/test/tw/weekly/c86_test.clj19
-rw-r--r--challenge-086/tyler-wardhaugh/lua/README.md6
11 files changed, 155 insertions, 19 deletions
diff --git a/challenge-086/tyler-wardhaugh/clojure/README.md b/challenge-086/tyler-wardhaugh/clojure/README.md
index 32d800bdc9..ada4806466 100644
--- a/challenge-086/tyler-wardhaugh/clojure/README.md
+++ b/challenge-086/tyler-wardhaugh/clojure/README.md
@@ -1,13 +1,13 @@
-# tw.weekly.c85
+# tw.weekly.c86
-The Weekly Challenge - #085 - Tyler Wardhaugh
+The Weekly Challenge - #086 - Tyler Wardhaugh
## Usage
Run the project directly (shows default output from both tasks):
- $ clojure -M -m tw.weekly.c85.core
+ $ clojure -M -m tw.weekly.c86.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 -m tw.weekly.c85.t1 A1 A2 A3...
+ $ clojure -M -m tw.weekly.c86.t1 A N1 N2 N3...
Run Task #2 with input:
- $ clojure -M -m tw.weekly.c85.t2 N
+ $ clojure -M -m tw.weekly.c86.t2 SUDOKO-FILE
## Project Template
diff --git a/challenge-086/tyler-wardhaugh/clojure/deps.edn b/challenge-086/tyler-wardhaugh/clojure/deps.edn
index 71a0090da5..18ea25ec63 100644
--- a/challenge-086/tyler-wardhaugh/clojure/deps.edn
+++ b/challenge-086/tyler-wardhaugh/clojure/deps.edn
@@ -1,7 +1,7 @@
{:paths ["src" "resources"]
:deps {org.clojure/clojure {:mvn/version "1.10.1"}
- org.clojure/math.combinatorics {:mvn/version "0.1.6"}
- org.clojure/math.numeric-tower {:mvn/version "0.0.4"}}
+ org.clojure/core.logic {:mvn/version "1.0.0"}
+ net.mikera/core.matrix {:mvn/version "0.62.0"}}
:aliases
{:test {:extra-paths ["test"]
:extra-deps {org.clojure/test.check {:mvn/version "1.0.0"}}}
@@ -12,5 +12,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.c84.jar"
- "-C" "-m" "tw.weekly.c84"]}}}
+ :main-opts ["-m" "hf.depstar.uberjar" "tw.weekly.c86.jar"
+ "-C" "-m" "tw.weekly.c86"]}}}
diff --git a/challenge-086/tyler-wardhaugh/clojure/pom.xml b/challenge-086/tyler-wardhaugh/clojure/pom.xml
index 75dbd11d47..cc507f3605 100644
--- a/challenge-086/tyler-wardhaugh/clojure/pom.xml
+++ b/challenge-086/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.c85</artifactId>
+ <artifactId>tw.weekly.c86</artifactId>
<version>0.1.0-SNAPSHOT</version>
- <name>tw.weekly.c85</name>
- <description>Challenge #085</description>
- <url>https://github.com/tw.weekly/tw.weekly.c85</url>
+ <name>tw.weekly.c86</name>
+ <description>Challenge #086</description>
+ <url>https://github.com/tw.weekly/tw.weekly.c86</url>
<licenses>
<license>
<name>Eclipse Public License</name>
@@ -19,9 +19,9 @@
</developer>
</developers>
<scm>
- <url>https://github.com/tw.weekly/tw.weekly.c85</url>
- <connection>scm:git:git://github.com/tw.weekly/tw.weekly.c85.git</connection>
- <developerConnection>scm:git:ssh://git@github.com/tw.weekly/tw.weekly.c85.git</developerConnection>
+ <url>https://github.com/tw.weekly/tw.weekly.c86</url>
+ <connection>scm:git:git://github.com/tw.weekly/tw.weekly.c86.git</connection>
+ <developerConnection>scm:git:ssh://git@github.com/tw.weekly/tw.weekly.c86.git</developerConnection>
<tag>HEAD</tag>
</scm>
<dependencies>
@@ -30,6 +30,16 @@
<artifactId>clojure</artifactId>
<version>1.10.1</version>
</dependency>
+ <dependency>
+ <groupId>org.clojure</groupId>
+ <artifactId>core.logic</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>net.mikera</groupId>
+ <artifactId>core.matrix</artifactId>
+ <version>0.62.0</version>
+ </dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
diff --git a/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-1 b/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-1
new file mode 100644
index 0000000000..686c091688
--- /dev/null
+++ b/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-1
@@ -0,0 +1,9 @@
+[ _ _ _ 2 6 _ 7 _ 1 ]
+[ 6 8 _ _ 7 _ _ 9 _ ]
+[ 1 9 _ _ _ 4 5 _ _ ]
+[ 8 2 _ 1 _ _ _ 4 _ ]
+[ _ _ 4 6 _ 2 9 _ _ ]
+[ _ 5 _ _ _ 3 _ 2 8 ]
+[ _ _ 9 3 _ _ _ 7 4 ]
+[ _ 4 _ _ 5 _ _ 3 6 ]
+[ 7 _ 3 _ 1 8 _ _ _ ]
diff --git a/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-2 b/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-2
new file mode 100644
index 0000000000..c7c2e7466d
--- /dev/null
+++ b/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-2
@@ -0,0 +1,9 @@
+[ 6 _ 8 _ 7 _ 5 _ 2 ]
+[ _ 5 _ 6 _ 8 _ 7 _ ]
+[ _ _ 2 _ _ _ 3 _ _ ]
+[ 5 _ _ _ 9 _ _ _ 6 ]
+[ _ 4 _ 3 _ 2 _ 5 _ ]
+[ 8 _ _ _ 5 _ _ _ 3 ]
+[ _ _ 5 _ _ _ 2 _ _ ]
+[ _ 1 _ 7 _ 4 _ 9 _ ]
+[ 4 _ 9 _ 6 _ 7 _ 1 ]
diff --git a/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-3 b/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-3
new file mode 100644
index 0000000000..07a30f0d19
--- /dev/null
+++ b/challenge-086/tyler-wardhaugh/clojure/resources/sudoku-3
@@ -0,0 +1,12 @@
+; source
+; #425, November 7 - November 13: The Weekly Extreme 'Unsolveable' Sudoku Puzzle
+; [Weekly Unsolvable Sudoku](https://www.sudokuwiki.org/weekly_sudoku.asp)
+[ 1 _ _ _ 2 _ _ _ _ ]
+[ _ 6 9 _ _ 8 5 _ _ ]
+[ _ 8 _ _ _ 9 7 1 _ ]
+[ _ _ _ 3 _ _ _ _ _ ]
+[ 3 5 _ _ _ 6 9 _ _ ]
+[ _ _ _ _ _ _ _ 4 _ ]
+[ _ _ _ _ _ _ 6 _ _ ]
+[ _ 9 _ _ _ _ _ 5 7 ]
+[ _ _ 6 _ _ 7 _ 8 9 ]
diff --git a/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/core.clj b/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/core.clj
new file mode 100644
index 0000000000..49466ce9ae
--- /dev/null
+++ b/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/core.clj
@@ -0,0 +1,12 @@
+(ns tw.weekly.c86.core
+ (:require [tw.weekly.c86.t1 :as t1])
+ (:require [tw.weekly.c86.t2 :as t2])
+ (:gen-class))
+
+(defn -main
+ "Run all tasks"
+ [& _]
+ (println "Task #1:")
+ (t1/-main)
+ (println "\nTask #2:")
+ (t2/-main))
diff --git a/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t1.clj b/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t1.clj
new file mode 100644
index 0000000000..4a6a873bc7
--- /dev/null
+++ b/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t1.clj
@@ -0,0 +1,24 @@
+(ns tw.weekly.c86.t1
+ (:require [clojure.edn :as edn]))
+
+;;;
+; Task description for TASK #1 › Pair Difference
+;;;
+
+(defn pair-difference
+ "Find a pair of coll such that their difference equals the target"
+ [target coll]
+ (let [freqs (frequencies coll)
+ s (-> freqs keys set)
+ repeater (fn [v] (when v (repeat 2 v)))]
+ (if (zero? target)
+ (->> freqs (filter (fn [[_ v]] (> v 1))) ffirst repeater)
+ (->> s (keep (fn [v] (let [k (+ target v)] (when (s k) [v k])))) first))))
+
+(defn -main
+ "Run Task 1 with a target A and a list of numbers N, defaulting to the
+ first example given in the task description."
+ [& args]
+ (let [A (or (some->> args first edn/read-string) 7)
+ N (or (some->> args rest (map edn/read-string)) [10 8 12 15 5])]
+ (println (if (pair-difference A N) 1 0))))
diff --git a/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t2.clj b/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t2.clj
new file mode 100644
index 0000000000..ae8c3a371e
--- /dev/null
+++ b/challenge-086/tyler-wardhaugh/clojure/src/tw/weekly/c86/t2.clj
@@ -0,0 +1,41 @@
+(ns tw.weekly.c86.t2
+ (:require [clojure.edn :as edn])
+ (:require [clojure.java.io :as io])
+ (:require [clojure.pprint :refer [cl-format]])
+ (:require [clojure.core.matrix :as m])
+ (:require [clojure.core.logic :as l])
+ (:require [clojure.core.logic.fd :as fd]))
+
+;;;
+; Task description for TASK #2 › Sudoku Puzzle
+;;;
+
+(defn parse-sudoku-file
+ "Parse a sudoku file and return a matrix"
+ [sudoku-file]
+ (with-open [in (io/reader sudoku-file)]
+ (edn/read-string (str \[ (slurp in) \]))))
+
+(defn solve
+ "Solve the sudoku puzzle"
+ [sudoku]
+ (let [board (m/emap (fn [x] (if (= '_ x) (l/lvar) x)) sudoku)
+ subsquares (for [x (range 0 9 3)
+ y (range 0 9 3)]
+ (m/eseq (m/submatrix board x 3 y 3)))]
+ (first
+ (l/run 1 [q]
+ (l/== q board)
+ (l/everyg (fn [q] (fd/in q (fd/interval 1 9))) (m/eseq board))
+ (l/everyg fd/distinct (m/rows board))
+ (l/everyg fd/distinct (m/columns board))
+ (l/everyg fd/distinct subsquares)))))
+
+(defn -main
+ "Run Task 2 with a given file containing a sudoku puzzle, defaulting
+ to the example given in the task description."
+ [& args]
+ (let [sudoku-file (or (some-> args first io/file) (io/resource "sudoku-1"))
+ sudoku (parse-sudoku-file sudoku-file)
+ solution (solve sudoku)]
+ (cl-format true "~:[No solution found~;~:*~{~a~^~%~}~]~%" solution)))
diff --git a/challenge-086/tyler-wardhaugh/clojure/test/tw/weekly/c86_test.clj b/challenge-086/tyler-wardhaugh/clojure/test/tw/weekly/c86_test.clj
new file mode 100644
index 0000000000..aff1b7f17d
--- /dev/null
+++ b/challenge-086/tyler-wardhaugh/clojure/test/tw/weekly/c86_test.clj
@@ -0,0 +1,19 @@
+(ns tw.weekly.c86-test
+ (:require [clojure.test :refer [deftest is testing]]
+ [clojure.java.io :as io]
+ [tw.weekly.c86.t1 :refer [pair-difference]]
+ [tw.weekly.c86.t2 :refer [parse-sudoku-file solve]]))
+
+(deftest task-1
+ (testing "Task 1, Pair Difference"
+ (is (some? (pair-difference 7 [10 8 12 15 5])))
+ (is (some? (pair-difference 6 [1 5 2 9 7])))
+ (is (nil? (pair-difference 15 [10 30 20 50 40])))
+ (is (some? (pair-difference 0 [100 1 2 3 4 5 100 999 999])))
+ (is (nil? (pair-difference 0 [100 1 2 3 4 5 101])))))
+
+(deftest task-2
+ (testing "Task 2, Power of Two Integers"
+ (is (some? (solve (parse-sudoku-file (io/resource "sudoku-1")))))
+ (is (some? (solve (parse-sudoku-file (io/resource "sudoku-2")))))
+ (is (some? (solve (parse-sudoku-file (io/resource "sudoku-3")))))))
diff --git a/challenge-086/tyler-wardhaugh/lua/README.md b/challenge-086/tyler-wardhaugh/lua/README.md
index 8c4c54f316..5a776b300d 100644
--- a/challenge-086/tyler-wardhaugh/lua/README.md
+++ b/challenge-086/tyler-wardhaugh/lua/README.md
@@ -1,17 +1,17 @@
# The Weekly Challenge
-The Weekly Challenge - #084 - Tyler Wardhaugh
+The Weekly Challenge - #086 - Tyler Wardhaugh
## Usage
Run Task 1:
- $ ./run.lua ch-1 A1 A2 A3...
+ $ ./run.lua ch-1 A N1 N2 N3...
Run Task 2:
- $ ./run.lua ch-2 N
+ $ ./run.lua ch-2 SUDOKO-FILE
Run the project's tests (all the samples from the task descriptions plus some others):