From 1ff5c4af749d7720f7aa1c0ebe54a70f58585763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Sun, 12 Jan 2025 22:48:51 -0800 Subject: [PATCH] Add `twelve-days` (#138) --- config.json | 8 ++ .../twelve-days/.docs/instructions.md | 36 ++++++ .../practice/twelve-days/.meta/config.json | 19 +++ .../twelve-days/.meta/src/example.art | 37 ++++++ .../practice/twelve-days/.meta/tests.toml | 55 ++++++++ .../practice/twelve-days/src/twelve-days.art | 4 + exercises/practice/twelve-days/tester.art | 3 + .../twelve-days/tests/test-twelve-days.art | 120 ++++++++++++++++++ 8 files changed, 282 insertions(+) create mode 100644 exercises/practice/twelve-days/.docs/instructions.md create mode 100644 exercises/practice/twelve-days/.meta/config.json create mode 100644 exercises/practice/twelve-days/.meta/src/example.art create mode 100644 exercises/practice/twelve-days/.meta/tests.toml create mode 100644 exercises/practice/twelve-days/src/twelve-days.art create mode 100644 exercises/practice/twelve-days/tester.art create mode 100644 exercises/practice/twelve-days/tests/test-twelve-days.art diff --git a/config.json b/config.json index d96ac73..d858764 100644 --- a/config.json +++ b/config.json @@ -397,6 +397,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "twelve-days", + "name": "Twelve Days", + "uuid": "29055b87-905f-43cf-99f4-6d8cff97f8b5", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "word-count", "name": "Word Count", 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..057e57d --- /dev/null +++ b/exercises/practice/twelve-days/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "src/twelve-days.art" + ], + "test": [ + "tests/test-twelve-days.art" + ], + "example": [ + ".meta/src/example.art" + ] + }, + "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/src/example.art b/exercises/practice/twelve-days/.meta/src/example.art new file mode 100644 index 0000000..b0cc62b --- /dev/null +++ b/exercises/practice/twelve-days/.meta/src/example.art @@ -0,0 +1,37 @@ +days: [ + "first" + "second" + "third" + "fourth" + "fifth" + "sixth" + "seventh" + "eighth" + "ninth" + "tenth" + "eleventh" + "twelfth" +] + +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," +] + +recite: function [startVerse endVerse][ + join.with:"\n" fold.seed:[] startVerse..endVerse [acc verse] [ + giftList: reverse take gifts verse + fragment: ~"On the |days\[dec verse]| day of Christmas my true love gave to me: |join.with:' ' giftList|" + acc ++ fragment + ] +] 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/src/twelve-days.art b/exercises/practice/twelve-days/src/twelve-days.art new file mode 100644 index 0000000..9413da5 --- /dev/null +++ b/exercises/practice/twelve-days/src/twelve-days.art @@ -0,0 +1,4 @@ +recite: function [startVerse endVerse][ + panic "Please implement the recite function" +] + diff --git a/exercises/practice/twelve-days/tester.art b/exercises/practice/twelve-days/tester.art new file mode 100644 index 0000000..80f4a8f --- /dev/null +++ b/exercises/practice/twelve-days/tester.art @@ -0,0 +1,3 @@ +import {unitt}! + +runTests.failFast findTests "tests" diff --git a/exercises/practice/twelve-days/tests/test-twelve-days.art b/exercises/practice/twelve-days/tests/test-twelve-days.art new file mode 100644 index 0000000..90bec34 --- /dev/null +++ b/exercises/practice/twelve-days/tests/test-twelve-days.art @@ -0,0 +1,120 @@ +import {unitt}! +import {src/twelve-days}! + + +suite "Twelve Days" [ + suite "verse" [ + test "first day a partridge in a pear tree" [ + results: recite 1 1 + expected: "On the first day of Christmas my true love gave to me: a Partridge in a Pear Tree." + assert -> expected = results + ] + + test.skip "second day two turtle doves" [ + results: 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 -> expected = results + ] + + test.skip "third day three french hens" [ + results: 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 -> expected = results + ] + + test.skip "fourth day four calling birds" [ + results: 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 -> expected = results + ] + + test.skip "fifth day five gold rings" [ + results: 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 -> expected = results + ] + + test.skip "sixth day six geese-a-laying" [ + results: 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 -> expected = results + ] + + test.skip "seventh day seven swans-a-swimming" [ + results: 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 -> expected = results + ] + + test.skip "eighth day eight maids-a-milking" [ + results: 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 -> expected = results + ] + + test.skip "ninth day nine ladies dancing" [ + results: 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 -> expected = results + ] + + test.skip "tenth day ten lords-a-leaping" [ + results: 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 -> expected = results + ] + + test.skip "eleventh day eleven pipers piping" [ + results: 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 -> expected = results + ] + + test.skip "twelfth day twelve drummers drumming" [ + results: 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 -> expected = results + ] + ] + + suite "lyrics" [ + test.skip "recites first three verses of the song" [ + results: recite 1 3 + expected: join.with:"\n" [ + "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 -> expected = results + ] + + test.skip "recites three verses from the middle of the song" [ + results: recite 4 6 + expected: join.with:"\n" [ + "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 -> expected = results + ] + + test.skip "recites the whole song" [ + results: recite 1 12 + expected: join.with:"\n" [ + "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 -> expected = results + ] + ] +]