From effc56c9f67f9e584cb98c4bc86ef3251a55d3cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Fri, 3 Jan 2025 23:56:05 -0800 Subject: [PATCH] Add `house` --- config.json | 8 + .../practice/house/.docs/instructions.md | 105 ++++++ exercises/practice/house/.meta/config.json | 19 + .../practice/house/.meta/src/example.art | 24 ++ exercises/practice/house/.meta/tests.toml | 52 +++ exercises/practice/house/src/house.art | 3 + exercises/practice/house/tester.art | 3 + exercises/practice/house/tests/test-house.art | 347 ++++++++++++++++++ 8 files changed, 561 insertions(+) create mode 100644 exercises/practice/house/.docs/instructions.md create mode 100644 exercises/practice/house/.meta/config.json create mode 100644 exercises/practice/house/.meta/src/example.art create mode 100644 exercises/practice/house/.meta/tests.toml create mode 100644 exercises/practice/house/src/house.art create mode 100644 exercises/practice/house/tester.art create mode 100644 exercises/practice/house/tests/test-house.art diff --git a/config.json b/config.json index 3fcf017..d96ac73 100644 --- a/config.json +++ b/config.json @@ -429,6 +429,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "house", + "name": "House", + "uuid": "03887d7d-0635-4175-8753-b06efb8a424b", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "matching-brackets", "name": "Matching Brackets", diff --git a/exercises/practice/house/.docs/instructions.md b/exercises/practice/house/.docs/instructions.md new file mode 100644 index 0000000..88928c5 --- /dev/null +++ b/exercises/practice/house/.docs/instructions.md @@ -0,0 +1,105 @@ +# Instructions + +Recite the nursery rhyme 'This is the House that Jack Built'. + +> [The] process of placing a phrase of clause within another phrase of clause is called embedding. +> It is through the processes of recursion and embedding that we are able to take a finite number of forms (words and phrases) and construct an infinite number of expressions. +> Furthermore, embedding also allows us to construct an infinitely long structure, in theory anyway. + +- [papyr.com][papyr] + +The nursery rhyme reads as follows: + +```text +This is the house that Jack built. + +This is the malt +that lay in the house that Jack built. + +This is the rat +that ate the malt +that lay in the house that Jack built. + +This is the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the cow with the crumpled horn +that tossed the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the maiden all forlorn +that milked the cow with the crumpled horn +that tossed the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the man all tattered and torn +that kissed the maiden all forlorn +that milked the cow with the crumpled horn +that tossed the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the priest all shaven and shorn +that married the man all tattered and torn +that kissed the maiden all forlorn +that milked the cow with the crumpled horn +that tossed the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the rooster that crowed in the morn +that woke the priest all shaven and shorn +that married the man all tattered and torn +that kissed the maiden all forlorn +that milked the cow with the crumpled horn +that tossed the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the farmer sowing his corn +that kept the rooster that crowed in the morn +that woke the priest all shaven and shorn +that married the man all tattered and torn +that kissed the maiden all forlorn +that milked the cow with the crumpled horn +that tossed the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. + +This is the horse and the hound and the horn +that belonged to the farmer sowing his corn +that kept the rooster that crowed in the morn +that woke the priest all shaven and shorn +that married the man all tattered and torn +that kissed the maiden all forlorn +that milked the cow with the crumpled horn +that tossed the dog +that worried the cat +that killed the rat +that ate the malt +that lay in the house that Jack built. +``` + +[papyr]: https://papyr.com/hypertextbooks/grammar/ph_noun.htm diff --git a/exercises/practice/house/.meta/config.json b/exercises/practice/house/.meta/config.json new file mode 100644 index 0000000..a006011 --- /dev/null +++ b/exercises/practice/house/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "src/house.art" + ], + "test": [ + "tests/test-house.art" + ], + "example": [ + ".meta/src/example.art" + ] + }, + "blurb": "Output the nursery rhyme 'This is the House that Jack Built'.", + "source": "British nursery rhyme", + "source_url": "https://en.wikipedia.org/wiki/This_Is_The_House_That_Jack_Built" +} diff --git a/exercises/practice/house/.meta/src/example.art b/exercises/practice/house/.meta/src/example.art new file mode 100644 index 0000000..0422be5 --- /dev/null +++ b/exercises/practice/house/.meta/src/example.art @@ -0,0 +1,24 @@ +parts: [ + "the house that Jack built" + "the malt that lay in" + "the rat that ate" + "the cat that killed" + "the dog that worried" + "the cow with the crumpled horn that tossed" + "the maiden all forlorn that milked" + "the man all tattered and torn that kissed" + "the priest all shaven and shorn that married" + "the rooster that crowed in the morn that woke" + "the farmer sowing his corn that kept" + "the horse and the hound and the horn that belonged to" +] + +recite: function [startVerse endVerse][ + result: fold.seed:[] range dec startVerse dec endVerse [verses verse] [ + fragment: fold.seed:"" 0..verse [acc n] [ + acc ++ ~" |parts\[verse - n]|" + ] + append verses ~"This is|fragment|." + ] + join.with:"\n" result +] diff --git a/exercises/practice/house/.meta/tests.toml b/exercises/practice/house/.meta/tests.toml new file mode 100644 index 0000000..da24dc3 --- /dev/null +++ b/exercises/practice/house/.meta/tests.toml @@ -0,0 +1,52 @@ +# 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. + +[28a540ff-f765-4348-9d57-ae33f25f41f2] +description = "verse one - the house that jack built" + +[ebc825ac-6e2b-4a5e-9afd-95732191c8da] +description = "verse two - the malt that lay" + +[1ed8bb0f-edb8-4bd1-b6d4-b64754fe4a60] +description = "verse three - the rat that ate" + +[64b0954e-8b7d-4d14-aad0-d3f6ce297a30] +description = "verse four - the cat that killed" + +[1e8d56bc-fe31-424d-9084-61e6111d2c82] +description = "verse five - the dog that worried" + +[6312dc6f-ab0a-40c9-8a55-8d4e582beac4] +description = "verse six - the cow with the crumpled horn" + +[68f76d18-6e19-4692-819c-5ff6a7f92feb] +description = "verse seven - the maiden all forlorn" + +[73872564-2004-4071-b51d-2e4326096747] +description = "verse eight - the man all tattered and torn" + +[0d53d743-66cb-4351-a173-82702f3338c9] +description = "verse nine - the priest all shaven and shorn" + +[452f24dc-8fd7-4a82-be1a-3b4839cfeb41] +description = "verse 10 - the rooster that crowed in the morn" + +[97176f20-2dd3-4646-ac72-cffced91ea26] +description = "verse 11 - the farmer sowing his corn" + +[09824c29-6aad-4dcd-ac98-f61374a6a8b7] +description = "verse 12 - the horse and the hound and the horn" + +[d2b980d3-7851-49e1-97ab-1524515ec200] +description = "multiple verses" + +[0311d1d0-e085-4f23-8ae7-92406fb3e803] +description = "full rhyme" diff --git a/exercises/practice/house/src/house.art b/exercises/practice/house/src/house.art new file mode 100644 index 0000000..d0a27ec --- /dev/null +++ b/exercises/practice/house/src/house.art @@ -0,0 +1,3 @@ +recite: function [startVerse endVerse][ + panic "Please implement the recite function" +] diff --git a/exercises/practice/house/tester.art b/exercises/practice/house/tester.art new file mode 100644 index 0000000..80f4a8f --- /dev/null +++ b/exercises/practice/house/tester.art @@ -0,0 +1,3 @@ +import {unitt}! + +runTests.failFast findTests "tests" diff --git a/exercises/practice/house/tests/test-house.art b/exercises/practice/house/tests/test-house.art new file mode 100644 index 0000000..604882d --- /dev/null +++ b/exercises/practice/house/tests/test-house.art @@ -0,0 +1,347 @@ +import {unitt}! +import {src/house}! + + +suite "House" [ + test "verse one - the house that Jack built" [ + result: recite 1 1 + expected: "This is the house that Jack built." + assert -> expected = result + ] + + test.skip "verse two - the malt that lay" [ + result: recite 2 2 + expected: join.with:" " [ + "This is" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse three - the rat that ate" [ + result: recite 3 3 + expected: join.with:" " [ + "This is" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." +] + assert -> expected = result + ] + + test.skip "verse four - the cat that killed" [ + result: recite 4 4 + expected: join.with:" " [ + "This is" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse five - the dog that worried" [ + result: recite 5 5 + expected: join.with:" " [ + "This is" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse six - the cow with the crumpled horn" [ + result: recite 6 6 + expected: join.with:" " [ + "This is" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse seven - the maiden all forlorn" [ + result: recite 7 7 + expected: join.with:" " [ + "This is" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse eight - the man all tattered and torn" [ + result: recite 8 8 + expected: join.with:" " [ + "This is" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse nine - the priest all shaven and shorn" [ + result: recite 9 9 + expected: join.with:" " [ + "This is" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse 10 - the rooster that crowed in the morn" [ + result: recite 10 10 + expected: join.with:" " [ + "This is" + "the rooster that crowed in the morn that woke" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse 11 - the farmer sowing his corn" [ + result: recite 11 11 + expected: join.with:" " [ + "This is" + "the farmer sowing his corn that kept" + "the rooster that crowed in the morn that woke" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "verse 12 - the horse and the hound and the horn" [ + result: recite 12 12 + expected: join.with:" " [ + "This is" + "the horse and the hound and the horn that belonged to" + "the farmer sowing his corn that kept" + "the rooster that crowed in the morn that woke" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + assert -> expected = result + ] + + test.skip "multiple verses" [ + result: recite 4 8 + expected: join.with:"\n" @[ + join.with:" " [ + "This is" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + ] + assert -> expected = result + ] + + test.skip "full rhyme" [ + result: recite 1 12 + expected: join.with:"\n" @[ + "This is the house that Jack built." + join.with:" " [ + "This is" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the rooster that crowed in the morn that woke" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the farmer sowing his corn that kept" + "the rooster that crowed in the morn that woke" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + join.with:" " [ + "This is" + "the horse and the hound and the horn that belonged to" + "the farmer sowing his corn that kept" + "the rooster that crowed in the morn that woke" + "the priest all shaven and shorn that married" + "the man all tattered and torn that kissed" + "the maiden all forlorn that milked" + "the cow with the crumpled horn that tossed" + "the dog that worried" + "the cat that killed" + "the rat that ate" + "the malt that lay in" + "the house that Jack built." + ] + ] + + assert -> expected = result + ] +]