From aadbd64ad43803969502b9440a325dc8f09a50eb Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 26 Aug 2016 01:26:37 +0200 Subject: Fetch house --- go/house/README.md | 125 ++++++++++++++++++++++++++++++++++++ go/house/house_test.go | 169 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 294 insertions(+) create mode 100644 go/house/README.md create mode 100644 go/house/house_test.go (limited to 'go') diff --git a/go/house/README.md b/go/house/README.md new file mode 100644 index 0000000..f1eb6b8 --- /dev/null +++ b/go/house/README.md @@ -0,0 +1,125 @@ +# House + +Write a program that outputs 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](http://papyr.com/hypertextbooks/grammar/ph_noun.htm) + + +The nursery rhyme reads as follows: + +```plain +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. +``` + +To run the tests simply run the command `go test` in the exercise directory. + +If the test suite contains benchmarks, you can run these with the `-bench` +flag: + + go test -bench . + +For more detailed info about the Go track see the [help +page](http://exercism.io/languages/go). + +## Source + +British nursery rhyme [http://en.wikipedia.org/wiki/This_Is_The_House_That_Jack_Built](http://en.wikipedia.org/wiki/This_Is_The_House_That_Jack_Built) + +## Submitting Incomplete Problems +It's possible to submit an incomplete solution so you can see how others have completed the exercise. + diff --git a/go/house/house_test.go b/go/house/house_test.go new file mode 100644 index 0000000..d702dd0 --- /dev/null +++ b/go/house/house_test.go @@ -0,0 +1,169 @@ +// Embed embeds a noun phrase as the object of relative clause with a +// transitive verb. +// +// Argument relPhrase is a phrase with a relative clause, minus the object +// of the clause. That is, relPhrase consists of a subject, a relative +// pronoun, a transitive verb, possibly a preposition, but then no object. +// +// func Embed(relPhrase, nounPhrase string) string + +// Verse generates a verse of a song with relative clauses that have +// a recursive structure. +// +// func Verse(subject string, relPhrases []string, nounPhrase string) string +// +// There are different ways to do this of course, but try using Embed as a +// subroutine and using programmatic recursion that reflects the grammatical +// recursion. + +// Song generates the full text of "The House That Jack Built". Oh yes, you +// could just return a string literal, but humor us; use Verse as a subroutine. +// +// func Song() string + +package house + +import ( + "strings" + "testing" +) + +var ( + s = "This is" + r = []string{ + "the cat that broke", + "the vase that was on", + } + p = "the shelf." + last = len(r) - 1 + // song copied from readme + song = `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.` +) + +func TestEmbed(t *testing.T) { + l := r[last] + want := l + " " + p + if e := Embed(l, p); e != want { + t.Fatalf("Embed(%q, %q) = %q, want %q.", l, p, e, want) + } +} + +func TestVerse(t *testing.T) { + for i := len(r); i >= 0; i-- { + ri := r[i:] + want := s + " " + strings.Join(append(ri, p), " ") + if v := Verse(s, ri, p); v != want { + t.Fatalf("Verse(%q, %q, %q) = %q, want %q.", s, ri, p, v, want) + } + } +} + +func TestSong(t *testing.T) { + s := Song() + if s == song { + return + } + // a little help in locating an error + got := strings.Split(s, "\n") + want := strings.Split(song, "\n") + var g, w string + var i int + for i, w = range want { + if len(got) <= i { + g = "" + break + } + if g = got[i]; g != w { + break + } + } + t.Fatalf("Song() line %d = %q, want %q", i+1, g, w) +} -- cgit v1.2.3