Skip to content

Commit

Permalink
Add twelve-days exercise (#518)
Browse files Browse the repository at this point in the history
* Add twelve-days exercise

* Generate each verse
  • Loading branch information
keiravillekode authored Sep 28, 2024
1 parent e72019b commit 075ed54
Show file tree
Hide file tree
Showing 9 changed files with 327 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,14 @@
"exception_handling"
]
},
{
"slug": "twelve-days",
"name": "Twelve Days",
"uuid": "51ea559b-818b-47a9-91af-53772c46e171",
"practices": [],
"prerequisites": [],
"difficulty": 3
},
{
"slug": "word-count",
"name": "Word Count",
Expand Down
5 changes: 5 additions & 0 deletions exercises/practice/twelve-days/.busted
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
return {
default = {
ROOT = { '.' }
}
}
36 changes: 36 additions & 0 deletions exercises/practice/twelve-days/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Instructions

Your task in this exercise is to write code that returns the lyrics of the song: "The Twelve Days of Christmas."

"The Twelve Days of Christmas" is a common English Christmas carol.
Each subsequent verse of the song builds on the previous verse.

The lyrics your code returns should _exactly_ match the full song text shown below.

## Lyrics

```text
On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.
On the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.
On the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the seventh day of Christmas my true love gave to me: seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the eighth day of Christmas my true love gave to me: eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the ninth day of Christmas my true love gave to me: nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the tenth day of Christmas my true love gave to me: ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the eleventh day of Christmas my true love gave to me: eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
On the twelfth day of Christmas my true love gave to me: twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.
```
19 changes: 19 additions & 0 deletions exercises/practice/twelve-days/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"keiravillekode"
],
"files": {
"solution": [
"twelve-days.lua"
],
"test": [
"twelve-days_spec.lua"
],
"example": [
".meta/example.lua"
]
},
"blurb": "Output the lyrics to 'The Twelve Days of Christmas'.",
"source": "Wikipedia",
"source_url": "https://en.wikipedia.org/wiki/The_Twelve_Days_of_Christmas_(song)"
}
48 changes: 48 additions & 0 deletions exercises/practice/twelve-days/.meta/example.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
local function recite_verse(verse)
local ordinals = {
'first',
'second',
'third',
'fourth',
'fifth',
'sixth',
'seventh',
'eighth',
'ninth',
'tenth',
'eleventh',
'twelfth'
}

local gifts = {
'a Partridge in a Pear Tree.',
'two Turtle Doves, and',
'three French Hens,',
'four Calling Birds,',
'five Gold Rings,',
'six Geese-a-Laying,',
'seven Swans-a-Swimming,',
'eight Maids-a-Milking,',
'nine Ladies Dancing,',
'ten Lords-a-Leaping,',
'eleven Pipers Piping,',
'twelve Drummers Drumming,'
}

local result = { 'On the', ordinals[verse], 'day of Christmas my true love gave to me:' }
for index = verse, 1, -1 do
table.insert(result, gifts[index])
end

return table.concat(result, ' ')
end

local function recite(start_verse, end_verse)
local result = {}
for verse = start_verse, end_verse do
table.insert(result, recite_verse(verse))
end
return result
end

return { recite = recite }
26 changes: 26 additions & 0 deletions exercises/practice/twelve-days/.meta/spec_generator.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
local map = function(t, f)
local mapped = {}
for i, v in ipairs(t) do
mapped[i] = f(v)
end
return mapped
end

local function render_song(lines)
return table.concat(map(lines, function(line)
return '\'' .. line .. '\''
end), ',\n')
end

return {
module_name = 'twelve_days',

generate_test = function(case)
local template = [[
local expected = {
%s
}
assert.are.same(expected, twelve_days.recite(%d, %d))]]
return template:format(render_song(case.expected), case.input.startVerse, case.input.endVerse)
end
}
55 changes: 55 additions & 0 deletions exercises/practice/twelve-days/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[c0b5a5e6-c89d-49b1-a6b2-9f523bff33f7]
description = "verse -> first day a partridge in a pear tree"

[1c64508a-df3d-420a-b8e1-fe408847854a]
description = "verse -> second day two turtle doves"

[a919e09c-75b2-4e64-bb23-de4a692060a8]
description = "verse -> third day three french hens"

[9bed8631-ec60-4894-a3bb-4f0ec9fbe68d]
description = "verse -> fourth day four calling birds"

[cf1024f0-73b6-4545-be57-e9cea565289a]
description = "verse -> fifth day five gold rings"

[50bd3393-868a-4f24-a618-68df3d02ff04]
description = "verse -> sixth day six geese-a-laying"

[8f29638c-9bf1-4680-94be-e8b84e4ade83]
description = "verse -> seventh day seven swans-a-swimming"

[7038d6e1-e377-47ad-8c37-10670a05bc05]
description = "verse -> eighth day eight maids-a-milking"

[37a800a6-7a56-4352-8d72-0f51eb37cfe8]
description = "verse -> ninth day nine ladies dancing"

[10b158aa-49ff-4b2d-afc3-13af9133510d]
description = "verse -> tenth day ten lords-a-leaping"

[08d7d453-f2ba-478d-8df0-d39ea6a4f457]
description = "verse -> eleventh day eleven pipers piping"

[0620fea7-1704-4e48-b557-c05bf43967f0]
description = "verse -> twelfth day twelve drummers drumming"

[da8b9013-b1e8-49df-b6ef-ddec0219e398]
description = "lyrics -> recites first three verses of the song"

[c095af0d-3137-4653-ad32-bfb899eda24c]
description = "lyrics -> recites three verses from the middle of the song"

[20921bc9-cc52-4627-80b3-198cbbfcf9b7]
description = "lyrics -> recites the whole song"
5 changes: 5 additions & 0 deletions exercises/practice/twelve-days/twelve-days.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
local function recite(start_verse, end_verse)

end

return { recite = recite }
125 changes: 125 additions & 0 deletions exercises/practice/twelve-days/twelve-days_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
local twelve_days = require('twelve-days')

describe('twelve-days', function()
describe('verse', function()
it('first day a partridge in a pear tree', function()
local expected = { 'On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.' }
assert.are.same(expected, twelve_days.recite(1, 1))
end)

it('second day two turtle doves', function()
local expected = {
'On the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(2, 2))
end)

it('third day three french hens', function()
local expected = {
'On the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(3, 3))
end)

it('fourth day four calling birds', function()
local expected = {
'On the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(4, 4))
end)

it('fifth day five gold rings', function()
local expected = {
'On the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(5, 5))
end)

it('sixth day six geese-a-laying', function()
local expected = {
'On the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(6, 6))
end)

it('seventh day seven swans-a-swimming', function()
local expected = {
'On the seventh day of Christmas my true love gave to me: seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(7, 7))
end)

it('eighth day eight maids-a-milking', function()
local expected = {
'On the eighth day of Christmas my true love gave to me: eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(8, 8))
end)

it('ninth day nine ladies dancing', function()
local expected = {
'On the ninth day of Christmas my true love gave to me: nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(9, 9))
end)

it('tenth day ten lords-a-leaping', function()
local expected = {
'On the tenth day of Christmas my true love gave to me: ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(10, 10))
end)

it('eleventh day eleven pipers piping', function()
local expected = {
'On the eleventh day of Christmas my true love gave to me: eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(11, 11))
end)

it('twelfth day twelve drummers drumming', function()
local expected = {
'On the twelfth day of Christmas my true love gave to me: twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(12, 12))
end)
end)

describe('lyrics', function()
it('recites first three verses of the song', function()
local expected = {
'On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.',
'On the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.',
'On the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(1, 3))
end)

it('recites three verses from the middle of the song', function()
local expected = {
'On the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(4, 6))
end)

it('recites the whole song', function()
local expected = {
'On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.',
'On the second day of Christmas my true love gave to me: two Turtle Doves, and a Partridge in a Pear Tree.',
'On the third day of Christmas my true love gave to me: three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the fourth day of Christmas my true love gave to me: four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the fifth day of Christmas my true love gave to me: five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the sixth day of Christmas my true love gave to me: six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the seventh day of Christmas my true love gave to me: seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the eighth day of Christmas my true love gave to me: eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the ninth day of Christmas my true love gave to me: nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the tenth day of Christmas my true love gave to me: ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the eleventh day of Christmas my true love gave to me: eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.',
'On the twelfth day of Christmas my true love gave to me: twelve Drummers Drumming, eleven Pipers Piping, ten Lords-a-Leaping, nine Ladies Dancing, eight Maids-a-Milking, seven Swans-a-Swimming, six Geese-a-Laying, five Gold Rings, four Calling Birds, three French Hens, two Turtle Doves, and a Partridge in a Pear Tree.'
}
assert.are.same(expected, twelve_days.recite(1, 12))
end)
end)
end)

0 comments on commit 075ed54

Please sign in to comment.