"Daniel Moore" <yahivin@gmail.com> wrote in message
news:89672ce30903060825v33c1264eva295783120c794b4@mail.gmail.com...
## Rhyming Words (#195)
Salutations fellow Rubyists,
This weeks quiz comes courtesy of Redd Vinylene:
> How do I match words that rhyme, like end rhymes, last syllable
> rhymes, double rhymes, beginning rhymes and first syllable rhymes?
>
> Like rhymer.com. I'm looking to improve my freestyle skills
>
> http://www.youtube.com/watch?v=SmqXKbxDoJ0Your task is to create a Ruby program that when given a word and a
type of rhyme (end rhymes, last syllable rhymes, double rhymes,
beginning rhymes, first syllable rhymes) returns a list of rhyming
words.Have Fun!
-----------------------------------------------------------------------------------
My solution takes the quiz idea, but not really its requirements
I've decided to drop the syllable-based rhymes only at first, as they asked
for a pretty cumbersome pieces of code. After implementing and trying it out
I've found that to my own taste _all_ types of rhymes described at
rhymer.com do not add enough to behavior to grant complications of code, so
I've cleaned them out too
My final solution is limited to perfect and identical rhymes only.
First two commented lines - commands to run before to make it work.
You can see this working at http://gamewords.herokugarden.com/
# wget http://www.dcs.shef.ac.uk/research/ilash/Moby/mpron.tar.Z
# tar zxvf mpron.tar.Z
$words = Hash.new{|h,k| h[k]=}
$rhymes = Hash.new{|h,k| h[k]=}
def perfect_key(pron)
key =
pron.reverse.each do |snd|
key << snd
break if snd =~ /1$/
end
key
end
def rhymes(word)
wup = word.upcase
$rhymes[perfect_key($words[wup])] - [wup]
end
File.open('mpron/cmudict0.3') {|f| f.readlines}.each do |l|
w, *pron = l.strip.split(' ')
next unless !w.empty? and w.grep(/[^A-Z]/).empty?
pron.map!{|sound| sound.sub(/2/,'1')}
$words[w]=pron
$rhymes[perfect_key(pron)] << w
end
input = ARGV.empty? ? ['laughter', 'soaring', 'antelope'] : ARGV
print input.map{|w| w+': '+rhymes(w).map(&:downcase).join(',
')+"\n"}.join("\n")