I've been doing this as a kata a few times and I'm pretty happy with this last program. Please let me know what you think. Any feedback is appreciated. **First, the Kata** PigLatin Kata Create a PigLatin class that is initialized with a string - detail: The string is a list of words seperated by spaces: 'hello world' - detail: The string is accessed by a method named phrase - detail: The string can be reset at any time without re-initializing - example: PigLatin.new('hello world') completed (Y|n): Translate Method Create a translate method that translates the phrase from english to pig-latin. - detail: The method will return a string. - detail: The empty string will return nil. - example: "" translates to nil completed (Y|n): Translate words that start with vowels. - detail: Append "ay" to the word if it ends in a consonant. - example: "ask" translates to "askay" - detail: Append "yay" to the word if it ends with a vowel. - example: "apple" translates to "appleyay" - detail: Append "nay" to the word if it ends with "y". - example: "any" translates to "anynay" completed (Y|n): Translate a word that starts with a single consonant. - detail: Removing the consonant from the front of the word. - detail: Add the consonant to the end of the word. - detail: Append 'ay' to the resulting word. - example: "hello" translates to "ellohay" - example: "world" translates to "orldway" completed (Y|n): Translate words that start with multiple consonants. - detail: Remove all leading consonants from the front of the word. - detail: Add the consonants to the end of the word. - detail: Append 'ay' to the resulting word. - example: "known" translates to "ownknay" - example: "special" translates to "ecialspay" completed (Y|n): Support any number of words in the phrase. - example: "hello world" translates to "ellohay orldway" - detail: Each component of a hyphenated word is translated seperately. - example: "well-being" translates to "ellway-eingbay" completed (Y|n): Support capital letters. - detail: If a word is captalized, the translated word should be capitalized. - example: "Bill" translates to "Illbay" - example: "Andrew" translates to "Andreway" completed (Y|n): Retain punctuation. - detail: Punctuation marks should be retained from the source to the translated string - example: "fantastic!" tranlates to "anfasticfay!" - example: "Three things: one, two, three." translates to "Eethray ingsthay: oneyay, otway, eethray." completed (Y|n): Congratulations! - Create a PigLatin class that is initialized with a string 00:03:51 - Create a translate method that translates the phrase from english to p 00:02:09 - Translate words that start with vowels. 00:09:24 - Translate a word that starts with a single consonant. 00:05:13 - Translate words that start with multiple consonants. 00:01:26 - Support any number of words in the phrase. 02:48:13 - Support capital letters. 00:10:46 - Retain punctuation. 00:40:26 ---------------------------------------------------------------------- -------- Total Time taking PigLatin kata: 04:01:27 **Now, the Specs:** 1 require 'spec_helper' 2 require 'piglatin' 3 4 describe PigLatin do 5 subject(:piglatin) { PigLatin.new phrase } 6 let(:phrase) { "hello world" } 7 8 describe "new" do 9 specify { expect { piglatin }.to_not raise_error } 10 end 11 12 describe ".translate" do 13 let(:phrase) { "" } 14 its(:translate) { should eq("") } 15 16 context "for words that start with vowels" do 17 context "and end with consonants" do 18 let(:phrase) { "ask" } 19 subject(:translate) { piglatin.translate } 20 it 'appends ay' do 21 should eq("askay") 22 end 23 end 24 context "and end with vowels" do 25 let(:phrase) { "apple" } 26 its(:translate) do should eq("appleyay") end 27 end 28 context "and ends with y" do 29 let(:phrase) { "any" } 30 its(:translate) { should eq(phrase + "nay") } 31 end 32 end 33 34 context "words that start with consonants" do 35 let(:phrase) { "hello" } 36 its(:translate) { should eq("ellohay") } 37 end 38 context "words that start with multiple consonants" do 39 let(:phrase) { "known" } 40 its(:translate) { should eq("ownknay") } 41 end 42 context "multiple words" do 43 let(:phrase) { "hello world" } 44 its(:translate) { should eq("ellohay orldway") } 45 end 46 context 'hyphenated words' do 47 let(:phrase) { "well-being" } 48 its(:translate) { should eq("ellway-eingbay") } 49 end 50 context 'capatalized words' do 51 let(:phrase) { "Bill" } 52 its(:translate) { should eq("Illbay") } 53 end 54 context 'capatalized words' do 55 let(:phrase) { "Andrew" } 56 its(:translate) { should eq("Andreway") } 57 end 58 context 'punctuation marks' do 59 let(:phrase) { "fantastic!" } 60 its(:translate) { should eq("antasticfay!") } 61 end 62 context 'complex phrase' do 63 let(:phrase) { 'Three things: one, two, three.' } 64 its(:translate) { should eq('Eethray ingsthay: oneyay, otway, eethray.') } 65 end 66 end 67 end **And, finally, the PigLatin class:** 1 class PigLatin 2 attr_accessor :phrase 3 alias :initialize :phrase= 4 5 def translate 6 return "" if @phrase.empty? 7 @phrase.gsub!(/\w+/) { |word| translate_word(word) } 8 end 9 10 private 11 12 def translate_word(word) 13 # Consonants 14 word.concat(word.slice!(/^[^aeiou]*/i || "")) 15 # Vowels 16 word.gsub!(/y$/, "yn") or word.gsub!(/([aeiou])$/, '\1y') 17 # Capitalized Words 18 word.capitalize! if word.downcase! 19 # Ending 20 word += 'ay' 21 end 22 end