Skip to content

Commit

Permalink
add meetup exercise, part of 48 in 24
Browse files Browse the repository at this point in the history
  • Loading branch information
kmarker1101 committed Jun 17, 2024
1 parent b104f30 commit a425e68
Show file tree
Hide file tree
Showing 8 changed files with 850 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -862,6 +862,14 @@
"practices": [],
"prerequisites": [],
"difficulty": 5
},
{
"slug": "meetup",
"name": "Meetup",
"uuid": "80000759-8ca8-4ff8-a88f-34c4244ac6c5",
"practices": [],
"prerequisites": [],
"difficulty": 5
}
]
},
Expand Down
34 changes: 34 additions & 0 deletions exercises/practice/meetup/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Instructions

Your task is to find the exact date of a meetup, given a month, year, weekday and week.

There are five week values to consider: `first`, `second`, `third`, `fourth`, `last`, `teenth`.

For example, you might be asked to find the date for the meetup on the first Monday in January 2018 (January 1, 2018).

Similarly, you might be asked to find:

- 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)

## Teenth

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.
29 changes: 29 additions & 0 deletions exercises/practice/meetup/.docs/introduction.md
Original file line number Diff line number Diff line change
@@ -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.
18 changes: 18 additions & 0 deletions exercises/practice/meetup/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"authors": [
"kmarker1101"
],
"files": {
"solution": [
"meetup.el"
],
"test": [
"meetup-test.el"
],
"example": [
".meta/example.el"
]
},
"blurb": "Calculate the date of meetups.",
"source": "Jeremy Hinegardner mentioned a Boulder meetup that happens on the Wednesteenth of every month"
}
61 changes: 61 additions & 0 deletions exercises/practice/meetup/.meta/example.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
;;; meetup.el --- Meetup (exercism) -*- lexical-binding: t; -*-

;;; Commentary:

;;; Code:

(require 'calendar)

(defun last-day-of (month year)
(calendar-last-day-of-month month year))

(defun find-dow-near-date (target-dow start-day month year direction)
(let* ((direction-factor (if (eq direction :before) -1 1))
(current-day start-day)
(found-day nil))
(while (and (not found-day)
(<= 1 current-day (last-day-of month year)))
(let ((current-dow (calendar-day-of-week (list month current-day year))))
(when (= current-dow target-dow)
(setq found-day current-day)))
(setq current-day (+ current-day direction-factor)))
(list year month found-day)))

(defun meetup (month year dow schedule)
(let* ((target-dow (cdr (assoc dow +days-of-the-week+)))
(first-day-of-month (calendar-day-of-week (list month 1 year)))
(schedule-offset (cdr (assoc schedule +schedules+)))
(first-target-dow (+ 1 (- target-dow first-day-of-month)))
(first-occurrence (if (>= first-target-dow 1)
first-target-dow
(+ first-target-dow 7)))
(start-day (cond
((eq schedule :last)
(last-day-of month year))
((eq schedule :teenth)
13)
(t
(+ first-occurrence (* (/ (1- schedule-offset) 7) 7))))))
(if (eq schedule :last)
(find-dow-near-date target-dow start-day month year :before)
(find-dow-near-date target-dow start-day month year :after))))

(defconst +days-of-the-week+
'((:sunday . 0)
(:monday . 1)
(:tuesday . 2)
(:wednesday . 3)
(:thursday . 4)
(:friday . 5)
(:saturday . 6)))

(defconst +schedules+
'((:first . 1)
(:second . 8)
(:third . 15)
(:teenth . 13)
(:fourth . 22)
(:last . -7)))

(provide 'meetup)
;;; meetup.el ends here
Loading

0 comments on commit a425e68

Please sign in to comment.