summaryrefslogtreecommitdiff
path: root/go/house
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-08-26 01:26:37 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-08-26 01:26:37 +0200
commitaadbd64ad43803969502b9440a325dc8f09a50eb (patch)
treeed993f2e2b9972069cbcbfa9b1e055adbbaac28a /go/house
parent3a4941844541b33e9c63306802a35624c3c48818 (diff)
Fetch house
Diffstat (limited to 'go/house')
-rw-r--r--go/house/README.md125
-rw-r--r--go/house/house_test.go169
2 files changed, 294 insertions, 0 deletions
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)
+}