Skip to content

Instantly share code, notes, and snippets.

@zaratan
Forked from felhix/pig_latin.rb
Last active February 10, 2017 13:22
Show Gist options
  • Save zaratan/c8b96cd74fb9cef4d01886bc2f3becf6 to your computer and use it in GitHub Desktop.
Save zaratan/c8b96cd74fb9cef4d01886bc2f3becf6 to your computer and use it in GitHub Desktop.
#write your code here
def vowel?(letter)
['a', 'e', 'i', 'o', 'u'].include?(letter)
end
def process_letter(char, hash)
if hash[:first_vowel_not_found]
if vowel?(char)
hash[:before_first_vowel] << "ay"
hash[:first_vowel_not_found] = false
hash[:after_first_vowel] << char
else
hash[:before_first_vowel] << char
end
else
hash[:after_first_vowel] << char
end
end
def process_word(word)
result = {
before_first_vowel: [],
after_first_vowel: [],
first_vowel_not_found: true
}
word.chars.each_with_object(result) do |char, hash| # a b c
process_letter(char, hash)
end
(result[:after] + result[:before]).join
end
def better_process_word(word)
match = word.match(/^(?<before>[^aeiouy]*)(?<after>.*)$/)
"#{match[:after]}#{match[:before]}ay"
end
def translate(words)
words
.split
.map(&:process_word)
.join(" ")
end
translate("quiet cherry apple banana")
# # Topics
#
# * modules
# * strings
#
# # 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, but that should be enough to understand the tests.)
#
# See <http://en.wikipedia.org/wiki/Pig_latin> for more details.
#
#
require "pig_latin"
describe "#translate" do
it "translates a word beginning with a vowel" do
s = translate("apple")
expect(s).to eq("appleay")
end
it "translates a word beginning with a consonant" do
s = translate("banana")
expect(s).to eq("ananabay")
end
it "translates a word beginning with two consonants" do
s = translate("cherry")
expect(s).to eq("errychay")
end
it "translates two words" do
s = translate("eat pie")
expect(s).to eq("eatay iepay")
end
it "translates a word beginning with three consonants" do
expect(translate("three")).to eq("eethray")
end
it "counts 'sch' as a single phoneme" do
s = translate("school")
expect(s).to eq("oolschay")
end
it "counts 'qu' as a single phoneme" do
s = translate("quiet")
expect(s).to eq("ietquay")
end
it "counts 'qu' as a consonant even when it's preceded by a consonant" do
s = translate("square")
expect(s).to eq("aresquay")
end
it "translates many words" do
s = translate("the quick brown fox")
expect(s).to eq("ethay ickquay ownbray oxfay")
end
# Test-driving bonus:
# * write a test asserting that capitalized words are still capitalized (but with a different initial capital letter, of course)
# * retain the punctuation from the original phrase
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment