diff --git a/config.json b/config.json index 7e520b9..eda94d4 100644 --- a/config.json +++ b/config.json @@ -406,6 +406,14 @@ "practices": [], "prerequisites": [], "difficulty": 4 + }, + { + "slug": "twelve-days", + "name": "Twelve Days", + "uuid": "69322771-7756-42a9-a79b-8700ce877700", + "practices": [], + "prerequisites": [], + "difficulty": 4 } ] }, diff --git a/exercises/practice/twelve-days/.busted b/exercises/practice/twelve-days/.busted new file mode 100644 index 0000000..86b84e7 --- /dev/null +++ b/exercises/practice/twelve-days/.busted @@ -0,0 +1,5 @@ +return { + default = { + ROOT = { '.' } + } +} diff --git a/exercises/practice/twelve-days/.docs/instructions.md b/exercises/practice/twelve-days/.docs/instructions.md new file mode 100644 index 0000000..83bb6e1 --- /dev/null +++ b/exercises/practice/twelve-days/.docs/instructions.md @@ -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. +``` diff --git a/exercises/practice/twelve-days/.meta/config.json b/exercises/practice/twelve-days/.meta/config.json new file mode 100644 index 0000000..9d75243 --- /dev/null +++ b/exercises/practice/twelve-days/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "glennj" + ], + "files": { + "solution": [ + "twelve_days.moon" + ], + "test": [ + "twelve_days_spec.moon" + ], + "example": [ + ".meta/example.moon" + ] + }, + "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)" +} diff --git a/exercises/practice/twelve-days/.meta/example.moon b/exercises/practice/twelve-days/.meta/example.moon new file mode 100644 index 0000000..4eb01c5 --- /dev/null +++ b/exercises/practice/twelve-days/.meta/example.moon @@ -0,0 +1,31 @@ +nth = { 'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', + 'eighth', 'ninth', 'tenth', 'eleventh', 'twelfth' } + +presents = { + 'a Partridge in a Pear Tree', + 'two Turtle Doves', + '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', +} + +gifts = (n) -> + items = {} + table.insert items, 1, presents[i] for i = 1, n + items[#items] = "and #{items[#items]}" if n > 1 + table.concat items, ', ' + + +verse = (n) -> + "On the #{nth[n]} day of Christmas my true love gave to me: #{gifts n}." + +{ + recite: (start, stop) -> [verse i for i = start, stop] +} diff --git a/exercises/practice/twelve-days/.meta/spec_generator.moon b/exercises/practice/twelve-days/.meta/spec_generator.moon new file mode 100644 index 0000000..dc3b98f --- /dev/null +++ b/exercises/practice/twelve-days/.meta/spec_generator.moon @@ -0,0 +1,21 @@ +str_list = (list, level) -> + if #list <= 1 + "{#{table.concat [quote elem for elem in *list], ', '}}" + else + item = [indent quote(elem) .. ',', level + 1 for elem in *list] + table.insert item, 1, '{' + table.insert item, indent('}', level) + table.concat item, '\n' + + +{ + module_name: 'TwelveDays', + + generate_test: (case, level) -> + lines = { + "result = TwelveDays.#{case.property} #{case.input.startVerse}, #{case.input.endVerse}", + "expected = #{str_list case.expected, level}", + "assert.are.same expected, result" + } + table.concat [indent line, level for line in *lines], '\n' +} diff --git a/exercises/practice/twelve-days/.meta/tests.toml b/exercises/practice/twelve-days/.meta/tests.toml new file mode 100644 index 0000000..01fbc03 --- /dev/null +++ b/exercises/practice/twelve-days/.meta/tests.toml @@ -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" diff --git a/exercises/practice/twelve-days/twelve_days.moon b/exercises/practice/twelve-days/twelve_days.moon new file mode 100644 index 0000000..b643e6b --- /dev/null +++ b/exercises/practice/twelve-days/twelve_days.moon @@ -0,0 +1,4 @@ +{ + recite: (start, stop) -> + error 'Implement me' +} diff --git a/exercises/practice/twelve-days/twelve_days_spec.moon b/exercises/practice/twelve-days/twelve_days_spec.moon new file mode 100644 index 0000000..9bf188c --- /dev/null +++ b/exercises/practice/twelve-days/twelve_days_spec.moon @@ -0,0 +1,100 @@ +TwelveDays = require 'twelve_days' + +describe 'twelve-days', -> + describe 'verse', -> + it 'first day a partridge in a pear tree', -> + result = TwelveDays.recite 1, 1 + expected = {'On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree.'} + assert.are.same expected, result + + pending 'second day two turtle doves', -> + result = TwelveDays.recite 2, 2 + 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, result + + pending 'third day three french hens', -> + result = TwelveDays.recite 3, 3 + 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, result + + pending 'fourth day four calling birds', -> + result = TwelveDays.recite 4, 4 + 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, result + + pending 'fifth day five gold rings', -> + result = TwelveDays.recite 5, 5 + 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, result + + pending 'sixth day six geese-a-laying', -> + result = TwelveDays.recite 6, 6 + 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, result + + pending 'seventh day seven swans-a-swimming', -> + result = TwelveDays.recite 7, 7 + 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, result + + pending 'eighth day eight maids-a-milking', -> + result = TwelveDays.recite 8, 8 + 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, result + + pending 'ninth day nine ladies dancing', -> + result = TwelveDays.recite 9, 9 + 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, result + + pending 'tenth day ten lords-a-leaping', -> + result = TwelveDays.recite 10, 10 + 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, result + + pending 'eleventh day eleven pipers piping', -> + result = TwelveDays.recite 11, 11 + 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, result + + pending 'twelfth day twelve drummers drumming', -> + result = TwelveDays.recite 12, 12 + 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, result + + describe 'lyrics', -> + pending 'recites first three verses of the song', -> + result = TwelveDays.recite 1, 3 + 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, result + + pending 'recites three verses from the middle of the song', -> + result = TwelveDays.recite 4, 6 + 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, result + + pending 'recites the whole song', -> + result = TwelveDays.recite 1, 12 + 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, result