From 8e485c07945442cb64b8b0cdf48d17f9a1d27e4d Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 30 Aug 2016 03:01:10 +0200 Subject: Solve pig latin --- go/pig-latin/README.md | 36 ++++++++++++++++++++++++++++++++++++ go/pig-latin/pig_latin.go | 33 +++++++++++++++++++++++++++++++++ go/pig-latin/pig_latin_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 go/pig-latin/README.md create mode 100644 go/pig-latin/pig_latin.go create mode 100644 go/pig-latin/pig_latin_test.go 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 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) + } + } +} -- cgit v1.2.3