diff --git a/config.json b/config.json index 3a90e2b0..b7239344 100644 --- a/config.json +++ b/config.json @@ -315,6 +315,18 @@ "difficulty": 5, "topics": null }, + { + "slug": "difference-of-squares", + "name": "Difference Of Squares", + "uuid": "0a83a4b3-446b-424e-bd56-2b53c26a956d", + "practices": [ + "numbers" + ], + "prerequisites": [ + "numbers" + ], + "difficulty": 1 + }, { "slug": "crypto-square", "name": "Crypto Square", diff --git a/exercises/practice/difference-of-squares/.docs/instructions.md b/exercises/practice/difference-of-squares/.docs/instructions.md new file mode 100644 index 00000000..39c38b50 --- /dev/null +++ b/exercises/practice/difference-of-squares/.docs/instructions.md @@ -0,0 +1,14 @@ +# Instructions + +Find the difference between the square of the sum and the sum of the squares of the first N natural numbers. + +The square of the sum of the first ten natural numbers is +(1 + 2 + ... + 10)² = 55² = 3025. + +The sum of the squares of the first ten natural numbers is +1² + 2² + ... + 10² = 385. + +Hence the difference between the square of the sum of the first ten natural numbers and the sum of the squares of the first ten natural numbers is 3025 - 385 = 2640. + +You are not expected to discover an efficient solution to this yourself from first principles; research is allowed, indeed, encouraged. +Finding the best algorithm for the problem is a key skill in software engineering. diff --git a/exercises/practice/difference-of-squares/.meta/config.json b/exercises/practice/difference-of-squares/.meta/config.json new file mode 100644 index 00000000..524f4576 --- /dev/null +++ b/exercises/practice/difference-of-squares/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "ErikSchierboom" + ], + "files": { + "solution": [ + "src/difference_of_squares.cljs" + ], + "test": [ + "test/difference_of_squares_test.cljs" + ], + "example": [ + ".meta/src/example.cljs" + ] + }, + "blurb": "Find the difference between the square of the sum and the sum of the squares of the first N natural numbers.", + "source": "Problem 6 at Project Euler", + "source_url": "https://projecteuler.net/problem=6" +} diff --git a/exercises/practice/difference-of-squares/.meta/src/example.cljs b/exercises/practice/difference-of-squares/.meta/src/example.cljs new file mode 100644 index 00000000..c67705e8 --- /dev/null +++ b/exercises/practice/difference-of-squares/.meta/src/example.cljs @@ -0,0 +1,12 @@ +(ns difference-of-squares) + +(defn- sum [xs] (reduce + xs)) + +(defn sum-of-squares [n] + (sum (map #(int (Math/pow % 2)) (range 0 (inc n))))) + +(defn square-of-sum [n] + (int (Math/pow (sum (range 0 (inc n))) 2))) + +(defn difference [x] + (- (square-of-sum x) (sum-of-squares x))) diff --git a/exercises/practice/difference-of-squares/.meta/tests.toml b/exercises/practice/difference-of-squares/.meta/tests.toml new file mode 100644 index 00000000..6fed93da --- /dev/null +++ b/exercises/practice/difference-of-squares/.meta/tests.toml @@ -0,0 +1,30 @@ +# This is an auto-generated file. Regular comments will be removed when this +# file is regenerated. Regenerating will not touch any manually added keys, +# so comments can be added in a "comment" key. + +[e46c542b-31fc-4506-bcae-6b62b3268537] +description = "square of sum 1" + +[9b3f96cb-638d-41ee-99b7-b4f9c0622948] +description = "square of sum 5" + +[54ba043f-3c35-4d43-86ff-3a41625d5e86] +description = "square of sum 100" + +[01d84507-b03e-4238-9395-dd61d03074b5] +description = "sum of squares 1" + +[c93900cd-8cc2-4ca4-917b-dd3027023499] +description = "sum of squares 5" + +[94807386-73e4-4d9e-8dec-69eb135b19e4] +description = "sum of squares 100" + +[44f72ae6-31a7-437f-858d-2c0837adabb6] +description = "difference of squares 1" + +[005cb2bf-a0c8-46f3-ae25-924029f8b00b] +description = "difference of squares 5" + +[b1bf19de-9a16-41c0-a62b-1f02ecc0b036] +description = "difference of squares 100" diff --git a/exercises/practice/difference-of-squares/deps.edn b/exercises/practice/difference-of-squares/deps.edn new file mode 100644 index 00000000..5c65da55 --- /dev/null +++ b/exercises/practice/difference-of-squares/deps.edn @@ -0,0 +1,10 @@ +{:deps + {org.clojure/clojure {:mvn/version "1.10.1"} + org.clojure/clojurescript {:mvn/version "1.10.773"}} + + :aliases + {:test + {:extra-paths ["test"] + :extra-deps + {olical/cljs-test-runner {:mvn/version "3.8.0"}} + :main-opts ["-m" "cljs-test-runner.main"]}}} diff --git a/exercises/practice/difference-of-squares/src/difference_of_squares.cljs b/exercises/practice/difference-of-squares/src/difference_of_squares.cljs new file mode 100644 index 00000000..5200bdcd --- /dev/null +++ b/exercises/practice/difference-of-squares/src/difference_of_squares.cljs @@ -0,0 +1,13 @@ +(ns difference-of-squares) + +(defn difference [] ;; <- arglist goes here + ;; your code goes here +) + +(defn sum-of-squares [] ;; <- arglist goes here + ;; your code goes here +) + +(defn square-of-sum [] ;; <- arglist goes here + ;; your code goes here +) diff --git a/exercises/practice/difference-of-squares/test/difference_of_squares_test.cljs b/exercises/practice/difference-of-squares/test/difference_of_squares_test.cljs new file mode 100644 index 00000000..2355c8f6 --- /dev/null +++ b/exercises/practice/difference-of-squares/test/difference_of_squares_test.cljs @@ -0,0 +1,30 @@ +(ns difference-of-squares-test + (:require [clojure.test :refer [deftest is]] + [difference-of-squares :as dos])) + +(deftest square-of-sum-to-5 + (is (= 225 (dos/square-of-sum 5)))) + +(deftest sum-of-squares-to-5 + (is (= 55 (dos/sum-of-squares 5)))) + +(deftest difference-of-squares-to-5 + (is (= 170 (dos/difference 5)))) + +(deftest square-of-sum-to-10 + (is (= 3025 (dos/square-of-sum 10)))) + +(deftest sum-of-squares-to-10 + (is (= 385 (dos/sum-of-squares 10)))) + +(deftest difference-of-squares-to-10 + (is (= 2640 (dos/difference 10)))) + +(deftest square-of-sum-to-100 + (is (= 25502500 (dos/square-of-sum 100)))) + +(deftest sum-of-squares-to-100 + (is (= 338350 (dos/sum-of-squares 100)))) + +(deftest difference-of-squares-to-100 + (is (= 25164150 (dos/difference 100))))