Skip to content

Commit 2451220

Browse files
authored
[New practice exercise] Meetup (#499)
* empty template * [New practice exercise] Meetup * sorted config.json
1 parent 56a0ef9 commit 2451220

9 files changed

Lines changed: 1292 additions & 0 deletions

File tree

config.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,14 @@
980980
"prerequisites": [],
981981
"difficulty": 4
982982
},
983+
{
984+
"slug": "meetup",
985+
"name": "Meetup",
986+
"uuid": "af65d283-cb78-4bee-b1d1-557d677e775d",
987+
"practices": [],
988+
"prerequisites": [],
989+
"difficulty": 4
990+
},
983991
{
984992
"slug": "flower-field",
985993
"name": "Flower Field",
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Instructions
2+
3+
Your task is to find the exact date of a meetup, given a month, year, weekday and week.
4+
5+
There are six week values to consider: `first`, `second`, `third`, `fourth`, `last`, `teenth`.
6+
7+
For example, you might be asked to find the date for the meetup on the first Monday in January 2018 (January 1, 2018).
8+
9+
Similarly, you might be asked to find:
10+
11+
- the third Tuesday of August 2019 (August 20, 2019)
12+
- the teenth Wednesday of May 2020 (May 13, 2020)
13+
- the fourth Sunday of July 2021 (July 25, 2021)
14+
- the last Thursday of November 2022 (November 24, 2022)
15+
- the teenth Saturday of August 1953 (August 15, 1953)
16+
17+
## Teenth
18+
19+
The teenth week refers to the seven days in a month that end in '-teenth' (13th, 14th, 15th, 16th, 17th, 18th and 19th).
20+
21+
If asked to find the teenth Saturday of August, 1953, we check its calendar:
22+
23+
```plaintext
24+
August 1953
25+
Su Mo Tu We Th Fr Sa
26+
1
27+
2 3 4 5 6 7 8
28+
9 10 11 12 13 14 15
29+
16 17 18 19 20 21 22
30+
23 24 25 26 27 28 29
31+
30 31
32+
```
33+
34+
From this we find that the teenth Saturday is August 15, 1953.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Introduction
2+
3+
Every month, your partner meets up with their best friend.
4+
Both of them have very busy schedules, making it challenging to find a suitable date!
5+
Given your own busy schedule, your partner always double-checks potential meetup dates with you:
6+
7+
- "Can I meet up on the first Friday of next month?"
8+
- "What about the third Wednesday?"
9+
- "Maybe the last Sunday?"
10+
11+
In this month's call, your partner asked you this question:
12+
13+
- "I'd like to meet up on the teenth Thursday; is that okay?"
14+
15+
Confused, you ask what a "teenth" day is.
16+
Your partner explains that a teenth day, a concept they made up, refers to the days in a month that end in '-teenth':
17+
18+
- 13th (thirteenth)
19+
- 14th (fourteenth)
20+
- 15th (fifteenth)
21+
- 16th (sixteenth)
22+
- 17th (seventeenth)
23+
- 18th (eighteenth)
24+
- 19th (nineteenth)
25+
26+
As there are also seven weekdays, it is guaranteed that each day of the week has _exactly one_ teenth day each month.
27+
28+
Now that you understand the concept of a teenth day, you check your calendar.
29+
You don't have anything planned on the teenth Thursday, so you happily confirm the date with your partner.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"authors": [
3+
"colinleach"
4+
],
5+
"files": {
6+
"solution": [
7+
"meetup.R"
8+
],
9+
"test": [
10+
"test_meetup.R"
11+
],
12+
"example": [
13+
".meta/example.R"
14+
]
15+
},
16+
"blurb": "Calculate the date of meetups.",
17+
"source": "Jeremy Hinegardner mentioned a Boulder meetup that happens on the Wednesteenth of every month"
18+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
library(lubridate)
2+
library(stringr)
3+
4+
day_abbrevs <- c("Sun" = 1, "Mon" = 2, "Tue" = 3, "Wed" = 4,
5+
"Thu" = 5, "Fri" = 6, "Sat" = 7)
6+
week_specifiers <- c("first" = 1, "second" = 2, "third" = 3,
7+
"fourth" = 4, "fifth" = 5)
8+
9+
meetup <- function(year, month, week, day_of_week) {
10+
curr_month <- make_date(year, month)
11+
days <- make_date(year, month, 1:days_in_month(curr_month))
12+
num_dow <- day_abbrevs[str_sub(day_of_week, 1, 3)]
13+
valid_dates <- days[wday(days) == num_dow]
14+
15+
if (week %in% names(week_specifiers) &&
16+
length(valid_dates) >= week_specifiers[week]) {
17+
result <- valid_dates[week_specifiers[week]]
18+
} else if (week == "last") {
19+
result <- max(valid_dates)
20+
} else if (week == "teenth") {
21+
teenth <- valid_dates[day(valid_dates) %in% 13:19]
22+
result <- teenth
23+
} else {
24+
stop("Invalid input")
25+
}
26+
27+
result |> as.character()
28+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{%- import "generator_macros.j2" as macros with context -%}
2+
{{ macros.canonical_ref() }}
3+
4+
{{ macros.header() }}
5+
6+
{% for case in cases -%}
7+
test_that("{{ case["description"] }}", {
8+
year <- {{ case["input"]["year"] }}
9+
month <- {{ case["input"]["month"] }}
10+
week <- "{{ case["input"]["week"] }}"
11+
day_of_week <- "{{ case["input"]["dayofweek"] }}"
12+
expected <- "{{ case["expected"] }}"
13+
expect_equal({{ case["property"] }}(year, month, week, day_of_week), expected)
14+
})
15+
16+
{% endfor %}

0 commit comments

Comments
 (0)