Repository: exercism/clojure
Pull request #642 (2024-06-04 10:48:02)

meetup: sync
Sync the `meetup` exercise with the latest data, as defined in https://github.com/exercism/problem-specifications/tree/main/exercises/meetup.

- Feel free to close this PR if there is another PR that also syncs this exercise.
- When approved, feel free to merge this PR yourselves (you don't have to wait for me).

As this PR only updates docs and/or metadata, it won't trigger a re-run of existing solutions (see [the docs](https://exercism.org/docs/building/tracks)).


Patch:
diff --git a/exercises/practice/binary-search/.docs/instructions.md b/exercises/practice/binary-search/.docs/instructions.md
index aa1946c..12f4358 100644
--- a/exercises/practice/binary-search/.docs/instructions.md
+++ b/exercises/practice/binary-search/.docs/instructions.md
@@ -11,7 +11,7 @@ Binary search only works when a list has been sorted.
 
 The algorithm looks like this:
 
-- Find the middle element of a *sorted* list and compare it with the item we're looking for.
+- Find the middle element of a _sorted_ list and compare it with the item we're looking for.
 - If the middle element is our item, then we're done!
 - If the middle element is greater than our item, we can eliminate that element and all the elements **after** it.
 - If the middle element is less than our item, we can eliminate that element and all the elements **before** it.
diff --git a/exercises/practice/binary-search/.meta/config.json b/exercises/practice/binary-search/.meta/config.json
index 74b15a0..e2fe40d 100644
--- a/exercises/practice/binary-search/.meta/config.json
+++ b/exercises/practice/binary-search/.meta/config.json
@@ -24,5 +24,5 @@
   },
   "blurb": "Implement a binary search algorithm.",
   "source": "Wikipedia",
-  "source_url": "http://en.wikipedia.org/wiki/Binary_search_algorithm"
+  "source_url": "https://en.wikipedia.org/wiki/Binary_search_algorithm"
 }
diff --git a/exercises/practice/binary-search/.meta/src/example.clj b/exercises/practice/binary-search/.meta/src/example.clj
index 9ea77cf..416b0da 100644
--- a/exercises/practice/binary-search/.meta/src/example.clj
+++ b/exercises/practice/binary-search/.meta/src/example.clj
@@ -1,14 +1,15 @@
 (ns binary-search)
 
-(defn middle [alist]
-  (-> alist (count) (quot 2)))
-
 (defn search-for
-  [elem alist]
-  (let [middle (middle alist)
-        cur-elem (nth alist middle)]
-    (cond
-      (= cur-elem elem) middle
-      (or (= middle (count alist)) (zero? middle)) (throw (Exception. (format "%s not found in list" elem)))
-      (< cur-elem elem) (+ middle (search-for elem (drop middle alist)))
-      (> cur-elem elem) (search-for elem (take middle alist)))))
+  [n coll]
+  (let [coll (vec coll)]
+    (loop [low-idx 0
+           high-idx (dec (count coll))]
+      (if (> low-idx high-idx)
+        (throw (Exception. "not found"))
+        (let [mid-index (quot (+ high-idx low-idx) 2)
+              mid-item (get coll mid-index)]
+          (cond
+            (= n mid-item) mid-index
+            (> mid-item n) (recur low-idx (dec mid-index))
+            :else (recur (inc mid-index) high-idx)))))))
diff --git a/exercises/practice/meetup/.docs/instructions.md b/exercises/practice/meetup/.docs/instructions.md
index fe1a9c2..000de2f 100644
--- a/exercises/practice/meetup/.docs/instructions.md
+++ b/exercises/practice/meetup/.docs/instructions.md
@@ -1,27 +1,34 @@
 # Instructions
 
-Calculate the date of meetups.
+Your task is to find the exact date of a meetup, given a month, year, weekday and week.
 
-Typically meetups happen on the same day of the week.  In this exercise, you
-will take a description of a meetup date, and return the actual meetup date.
+There are five week values to consider: `first`, `second`, `third`, `fourth`, `last`, `teenth`.
 
-Examples of general descriptions are:
+For example, you might be asked to find the date for the meetup on the first Monday in January 2018 (January 1, 2018).
 
-- The first Monday of January 2017
-- The third Tuesday of January 2017
-- The wednesteenth of January 2017
-- The last Thursday of January 2017
+Similarly, you might be asked to find:
 
-The descriptors you are expected to parse are:
-first, second, third, fourth, fifth, last, monteenth, tuesteenth, wednesteenth,
-thursteenth, friteenth, saturteenth, sunteenth
+- the third Tuesday of August 2019 (August 20, 2019)
+- the teenth Wednesday of May 2020 (May 13, 2020)
+- the fourth Sunday of July 2021 (July 25, 2021)
+- the last Thursday of November 2022 (November 24, 2022)
+- the teenth Saturday of August 1953 (August 15, 1953)
 
-Note that "monteenth", "tuesteenth", etc are all made up words. There was a
-meetup whose members realized that there are exactly 7 numbered days in a month
-that end in '-teenth'. Therefore, one is guaranteed that each day of the week
-(Monday, Tuesday, ...) will have exactly one date that is named with '-teenth'
-in every month.
+## Teenth
 
-Given examples of a meetup dates, each containing a month, day, year, and
-descriptor calculate the date of the actual meetup.  For example, if given
-"The first Monday of January 2017", the correct meetup date is 2017/1/2.
+The teenth week refers to the seven days in a month that end in '-teenth' (13th, 14th, 15th, 16th, 17th, 18th and 19th).
+
+If asked to find the teenth Saturday of August, 1953, we check its calendar:
+
+```plaintext
+    August 1953
+Su Mo Tu We Th Fr Sa
+                   1
+ 2  3  4  5  6  7  8
+ 9 10 11 12 13 14 15
+16 17 18 19 20 21 22
+23 24 25 26 27 28 29
+30 31
+```
+
+From this we find that the teenth Saturday is August 15, 1953.
diff --git a/exercises/practice/meetup/.docs/introduction.md b/exercises/practice/meetup/.docs/introduction.md
new file mode 100644
index 0000000..29170ef
--- /dev/null
+++ b/exercises/practice/meetup/.docs/introduction.md
@@ -0,0 +1,29 @@
+# Introduction
+
+Every month, your partner meets up with their best friend.
+Both of them have very busy schedules, making it challenging to find a suitable date!
+Given your own busy schedule, your partner always double-checks potential meetup dates with you:
+
+- "Can I meet up on the first Friday of next month?"
+- "What about the third Wednesday?"
+- "Maybe the last Sunday?"
+
+In this month's call, your partner asked you this question:
+
+- "I'd like to meet up on the teenth Thursday; is that okay?"
+
+Confused, you ask what a "teenth" day is.
+Your partner explains that a teenth day, a concept they made up, refers to the days in a month that end in '-teenth':
+
+- 13th (thirteenth)
+- 14th (fourteenth)
+- 15th (fifteenth)
+- 16th (sixteenth)
+- 17th (seventeenth)
+- 18th (eighteenth)
+- 19th (nineteenth)
+
+As there are also seven weekdays, it is guaranteed that each day of the week has _exactly one_ teenth day each month.
+
+Now that you understand the concept of a teenth day, you check your calendar.
+You don't have anything planned on the teenth Thursday, so you happily confirm the date with your partner.
diff --git a/exercises/practice/meetup/.meta/config.json b/exercises/practice/meetup/.meta/config.json
index 240a6a3..c21c0b7 100644
--- a/exercises/practice/meetup/.meta/config.json
+++ b/exercises/practice/meetup/.meta/config.json
@@ -26,6 +26,5 @@
     ]
   },
   "blurb": "Calculate the date of meetups.",
-  "source": "Jeremy Hinegardner mentioned a Boulder meetup that happens on the Wednesteenth of every month",
-  "source_url": "https://twitter.com/copiousfreetime"
+  "source": "Jeremy Hinegardner mentioned a Boulder meetup that happens on the Wednesteenth of every month"
 }


Test patch:
diff --git a/exercises/practice/binary-search/test/binary_search_test.clj b/exercises/practice/binary-search/test/binary_search_test.clj
index 00efed5..60f8464 100644
--- a/exercises/practice/binary-search/test/binary_search_test.clj
+++ b/exercises/practice/binary-search/test/binary_search_test.clj
@@ -1,40 +1,52 @@
 (ns binary-search-test
-  (:require [clojure.test :refer [deftest is]]
+  (:require [clojure.test :refer [deftest is testing]]
             binary-search))
 
-(def short-vector [1, 3, 4, 6, 8, 9, 11])
-
-(def large-vector [1, 3, 5, 8, 13, 21, 34, 55, 89])
-
-(def even-length-vector [1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377])
-
-(deftest it-finds-position-of-middle-item
-  (is (= 3 (binary-search/middle short-vector))))
-
-(deftest searches-a-singleton
-  (is (= 0 (binary-search/search-for 4 [4]))))
-
-(deftest it-finds-position-of-search-data
-  (is (= 5 (binary-search/search-for 9 short-vector))))
-
-(deftest it-finds-position-in-a-larger-list
-  (is (= 1 (binary-search/search-for 3 large-vector))))
-
-(deftest it-finds-position-in-a-larger-list-again
-  (is (= 7 (binary-search/search-for 55 large-vector))))
-
-(deftest it-finds-correct-position-in-a-list-with-an-even-number-of-elements
-  (is (= 5 (binary-search/search-for 21 even-length-vector))))
-
-(deftest it-finds-correct-position-in-a-list-with-an-even-number-of-elements-again
-  (is (= 6 (binary-search/search-for 34 even-length-vector))))
-
-(deftest it-works-on-lists
-  (is (= 7 (binary-search/search-for 7 (range 10)))))
-
-(deftest it-works-on-lists-again
-  (is (= 4 (binary-search/search-for 3 '(-3 -2 0 1 3 4)))))
-
-(deftest throws-exception-when-element-not-found
-  (is (thrown-with-msg? Throwable #"not found"
-                        (binary-search/search-for 20 short-vector))))
+(deftest finds-value-in-array-with-one-element
+  (testing "Finds a value in an array with one element"
+           (is (= 0 (binary-search/search-for 6 [6])))))
+
+(deftest finds-value-in-middle-of-array
+  (testing "Finds a value in the middle of an array"
+    (is (= 3 (binary-search/search-for 6 [1, 3, 4, 6, 8, 9, 11])))))
+
+(deftest finds-value-at-beginning-of-array
+  (testing "Finds a value at the beginning of an array"
+    (is (= 0 (binary-search/search-for 1 [1, 3, 4, 6, 8, 9, 11])))))
+
+(deftest finds-value-at-end-of-array
+  (testing "Finds a value at the end of an array"
+    (is (= 6 (binary-search/search-for 11 [1, 3, 4, 6, 8, 9, 11])))))
+
+(deftest finds-value-in-array-of-odd-length
+  (testing "Finds a value in an array of odd length"
+    (is (= 9 (binary-search/search-for 144 [1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 634])))))
+
+(deftest finds-value-in-array-of-even-length
+  (testing "Finds a value in an array of even length"
+    (is (= 5 (binary-search/search-for 21 [1, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377])))))
+
+(deftest identifies-that-value-is-not-in-array
+  (testing "Identifies that a value is not included in the array"
+    (is (thrown-with-msg? Throwable #"not found"
+                          (binary-search/search-for 7 [1, 3, 4, 6, 8, 9, 11])))))
+
+(deftest value-smaller-than-arrays-smallest-value-not-found
+  (testing "A value smaller than the array's smallest value is not found"
+    (is (thrown-with-msg? Throwable #"not found"
+                          (binary-search/search-for 0 [1, 3, 4, 6, 8, 9, 11])))))
+
+(deftest value-larger-than-arrays-largest-value-not-found
+  (testing "A value larger than the array's largest value is not found"
+    (is (thrown-with-msg? Throwable #"not found"
+                          (binary-search/search-for 13 [1, 3, 4, 6, 8, 9, 11])))))
+
+(deftest nothing-found-in-empty-array
+  (testing "Nothing is found in an empty array"
+    (is (thrown-with-msg? Throwable #"not found"
+                          (binary-search/search-for 1 [])))))
+
+(deftest nothing-found-when-left-and-right-bounds-cross
+  (testing "Nothing is found when the left and right bounds cross"
+    (is (thrown-with-msg? Throwable #"not found"
+                          (binary-search/search-for 0 [1, 2])))))