Skip to content

Commit d5d8b6a

Browse files
authored
Add meetup (#118)
* Add meetup * instructions append * remove unused code from example
1 parent 499f026 commit d5d8b6a

12 files changed

Lines changed: 940 additions & 0 deletions

File tree

config.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,14 @@
618618
"prerequisites": [],
619619
"difficulty": 5
620620
},
621+
{
622+
"slug": "meetup",
623+
"name": "Meetup",
624+
"uuid": "cd3c3db9-a654-4137-9135-8971b07770b7",
625+
"practices": [],
626+
"prerequisites": [],
627+
"difficulty": 5
628+
},
621629
{
622630
"slug": "pig-latin",
623631
"name": "Pig Latin",

exercises/practice/meetup/.busted

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
return {
2+
default = {
3+
ROOT = { '.' }
4+
}
5+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# dummy
2+
3+
## MoonScript-specific instructions
4+
5+
You'll need to use Lua's builtin [`os.date`][lua-os-date] and [`os.time`][lua-os-time] functions in this exercise.
6+
7+
- `os.time(tbl)` converts a table containing a "date time specification" into an integer value.
8+
The argument is a table containing keys "year", "month", and "day"; and optionally "hour", "min", "sec", and "isdst".
9+
10+
- `os.date(format, time)` converts an integer time value into a formatted string.
11+
The format string is described in your [`strftime(3)`][strftime] man page.
12+
13+
[lua-os-date]: https://www.lua.org/manual/5.4/manual.html#pdf-os.date
14+
[lua-os-time]: https://www.lua.org/manual/5.4/manual.html#pdf-os.time
15+
[strftime]: https://manpage.me/index.cgi?apropos=0&q=strftime&sektion=3&manpath=Debian+8.1.0&arch=default&format=html
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+
"glennj"
4+
],
5+
"files": {
6+
"solution": [
7+
"meetup.moon"
8+
],
9+
"test": [
10+
"meetup_spec.moon"
11+
],
12+
"example": [
13+
".meta/example.moon"
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+
is_teenth = (time) ->
2+
day = tonumber os.date '%d', time
3+
13 <= day and day <= 19
4+
5+
{
6+
meetup: (input) ->
7+
{:year, :month, :week, :dayofweek} = input
8+
9+
days = {}
10+
t = {:year, :month, day: 0}
11+
while true
12+
t.day += 1
13+
time = os.time t
14+
if month != tonumber os.date '%m', time
15+
break
16+
if dayofweek == os.date '%A', time
17+
table.insert days, time
18+
19+
idx = switch week
20+
when 'first' then 1
21+
when 'second' then 2
22+
when 'third' then 3
23+
when 'fourth' then 4
24+
when 'last' then #days
25+
when 'teenth' then is_teenth(days[2]) and 2 or 3
26+
27+
os.date '%Y-%m-%d', days[idx]
28+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
table.tostring = (t) ->
2+
s = [string.format '%s: %q', k, v for k, v in pairs t]
3+
"{#{table.concat s, ', '}}"
4+
5+
{
6+
module_imports: {'meetup'},
7+
8+
generate_test: (case, level) ->
9+
lines = {
10+
"result = meetup #{table.tostring case.input}"
11+
"expected = #{quote case.expected}"
12+
"assert.are.equal expected, result"
13+
}
14+
table.concat [indent line, level for line in *lines], '\n'
15+
}

0 commit comments

Comments
 (0)