summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-08-30 03:01:10 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-08-30 03:01:10 +0200
commit8e485c07945442cb64b8b0cdf48d17f9a1d27e4d (patch)
treea2961e6a1cb89fa6e6e21c1fb605a0560b4c205a
parente3d678b04f6c4a24f49dd55ac46224b5f8607208 (diff)
Solve pig latin
-rw-r--r--go/pig-latin/README.md36
-rw-r--r--go/pig-latin/pig_latin.go33
-rw-r--r--go/pig-latin/pig_latin_test.go29
3 files changed, 98 insertions, 0 deletions
diff --git a/go/pig-latin/README.md b/go/pig-latin/README.md
new file mode 100644
index 0000000..e4def4c
--- /dev/null
+++ b/go/pig-latin/README.md
@@ -0,0 +1,36 @@
+# Pig Latin
+
+Implement a program that translates from English to Pig Latin
+
+Pig Latin is a made-up children's language that's intended to be
+confusing. It obeys a few simple rules (below), but when it's spoken
+quickly it's really difficult for non-children (and non-native speakers)
+to understand.
+
+- **Rule 1**: If a word begins with a vowel sound, add an "ay" sound to
+ the end of the word.
+- **Rule 2**: If a word begins with a consonant sound, move it to the
+ end of the word, and then add an "ay" sound to the end of the word.
+
+There are a few more rules for edge cases, and there are regional
+variants too.
+
+See <http://en.wikipedia.org/wiki/Pig_latin> for more details.
+
+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
+
+The Pig Latin exercise at Test First Teaching by Ultrasaurus [https://github.com/ultrasaurus/test-first-teaching/blob/master/learn_ruby/pig_latin/](https://github.com/ultrasaurus/test-first-teaching/blob/master/learn_ruby/pig_latin/)
+
+## 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/pig-latin/pig_latin.go b/go/pig-latin/pig_latin.go
new file mode 100644
index 0000000..295fac1
--- /dev/null
+++ b/go/pig-latin/pig_latin.go
@@ -0,0 +1,33 @@
+package igpay
+
+import "strings"
+
+func PigLatin(s string) string {
+ var ret []string
+ for _, v := range strings.Fields(s) {
+ if len(v) < 3 {
+ ret = append(ret, v)
+ continue
+ }
+ switch v[:3] {
+ case "squ", "sch", "thr":
+ ret = append(ret, v[3:]+v[:3]+"ay")
+ continue
+ }
+ switch v[:2] {
+ case "ch", "qu", "th", "sq":
+ ret = append(ret, v[2:]+v[:2]+"ay")
+ continue
+ case "ye", "xe":
+ ret = append(ret, v[1:]+v[:1]+"ay")
+ continue
+ }
+ switch v[:1] {
+ case "a", "e", "o", "u", "i", "y", "x":
+ ret = append(ret, s+"ay")
+ continue
+ }
+ ret = append(ret, v[1:]+v[:1]+"ay")
+ }
+ return strings.Join(ret, " ")
+}
diff --git a/go/pig-latin/pig_latin_test.go b/go/pig-latin/pig_latin_test.go
new file mode 100644
index 0000000..a8397a6
--- /dev/null
+++ b/go/pig-latin/pig_latin_test.go
@@ -0,0 +1,29 @@
+package igpay
+
+import "testing"
+
+var tests = []struct{ pl, in string }{
+ {"appleay", "apple"},
+ {"earay", "ear"},
+ {"igpay", "pig"},
+ {"oalakay", "koala"},
+ {"airchay", "chair"},
+ {"eenquay", "queen"},
+ {"aresquay", "square"},
+ {"erapythay", "therapy"},
+ {"ushthray", "thrush"},
+ {"oolschay", "school"},
+ {"ickquay astfay unray", "quick fast run"},
+ {"ellowyay", "yellow"},
+ {"yttriaay", "yttria"},
+ {"enonxay", "xenon"},
+ {"xrayay", "xray"},
+}
+
+func TestPigLatin(t *testing.T) {
+ for _, test := range tests {
+ if pl := PigLatin(test.in); pl != test.pl {
+ t.Fatalf("PigLatin(%q) = %q, want %q.", test.in, pl, test.pl)
+ }
+ }
+}