[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Ruby Nuby Question

NigamaX

12/7/2007 7:13:00 PM

Hello,

I am just learning Ruby, via several resources (online: Why's,
downloaded PDF's, and Chris Pine's book "Learn to Program Ruby"). I
finished Chris Pine's book and was going back through doing any of the
exercises I hadn't done the first time and trying to mess with/break the
programs I had done the first time through.

In looking back over my code and trying to clean things up, I managed to
think of two good questions I can't seem to find the answer to
elsewhere. I figured this was the brightest and smartest group of
Ruby-heads out there. :)

I'll ask my questions first and put the code from the program down
below. The assignment asked us to create a "Deaf Grandmother" program,
which you could only get out of by saying "BYE" to in all caps, three
times.

The first question I had was, for some reason, if you input "BYE!" for
the second or third required "BYE" (to exit/end the program), it
launches into an infinite loop. Why is that? BYE works correctly.
What is it about "BYE!"?

Second question is... what if I wanted the program to require you to say
"BYE" three times in a row instead of just three times throughout the
conversation. Is there any easy way to do this?


Okay, thanks for your time, the code from the program is below..

[code]
talk = 'I <3 my grandmother'
puts 'WHAT A FINE YOUNG GRANDCHILD YOU ARE, COME TO VISIT YOUR DEAR OLD
GRANNY! COME IN, COME IN!'

while talk != 'BYE'
talk = gets.chomp
if talk != talk.upcase
puts 'HUH?! SPEAK UP, SONNY!'
elsif talk == talk.upcase && talk != 'BYE'
year = 1
while year < 30
year = rand(51)
end
puts 'NO, NOT SINCE 19' + year.to_s + '!'
end
end

if talk == 'BYE'
puts 'WHAT WAS THAT?'
talk = gets.chomp
while talk != 'BYE'
if talk != talk.upcase
puts 'HUH?! SPEAK UP, SONNY!'
elsif talk == talk.upcase && talk != 'BYE'
year = 1
while year < 30
year = rand(51)
end
puts 'NO, NOT SINCE 19' + year.to_s + '!'
end
end

if talk == 'BYE'
puts 'EYE? WHAT\'S WRONG WITH YOUR EYE?'
talk = gets.chomp
while talk != 'BYE'
if talk != talk.upcase
puts 'HUH?! SPEAK UP, SONNY!'
elsif talk == talk.upcase && talk != 'BYE'
year = 1
while year < 30
year = rand(51)
end
puts 'NO, NOT SINCE 19' + year.to_s + '!'
end
end

if talk == 'BYE'
puts 'OH VERY WELL, SEE YOU ANOTHER TIME, THEN!'
end
end
end
[/code]
--
Posted via http://www.ruby-....

2 Answers

Morton Goldberg

12/8/2007 2:25:00 AM

0

On Dec 7, 2007, at 2:12 PM, Nigama Xx wrote:

> The first question I had was, for some reason, if you input "BYE!" for
> the second or third required "BYE" (to exit/end the program), it
> launches into an infinite loop. Why is that? BYE works correctly.
> What is it about "BYE!"?

<snip>

> if talk == 'BYE'
> puts 'EYE? WHAT\'S WRONG WITH YOUR EYE?'
> talk = gets.chomp
> while talk != 'BYE'
> if talk != talk.upcase
> puts 'HUH?! SPEAK UP, SONNY!'
> elsif talk == talk.upcase && talk != 'BYE'
> year = 1
> while year < 30
> year = rand(51)
> end
> puts 'NO, NOT SINCE 19' + year.to_s + '!'
> end
> end
>
> if talk == 'BYE'
> puts 'OH VERY WELL, SEE YOU ANOTHER TIME, THEN!'
> end
> end


Nothing is really special about "BYE!". Because you don't ask for
input within the while-loop, any response other than "BYE" will put
it into an infinite loop. The following revision will work.

<code>
if talk == 'BYE'
puts 'EYE? WHAT\'S WRONG WITH YOUR EYE?'
talk = gets.chomp
while talk != 'BYE'
if talk != talk.upcase
puts 'HUH?! SPEAK UP, SONNY!'
elsif talk == talk.upcase && talk != 'BYE'
year = 1
while year < 30
year = rand(51)
end
puts 'NO, NOT SINCE 19' + year.to_s + '!'
end
talk = gets.chomp # <--- new code here
end
if talk == 'BYE'
puts 'OH VERY WELL, SEE YOU ANOTHER TIME, THEN!'
end
end
</code>

Also you might be interested in simplifying your code -- for example:

<code>
if talk == 'BYE'
puts 'EYE? WHAT\'S WRONG WITH YOUR EYE?'
talk = gets.chomp
while talk != 'BYE'
if talk != talk.upcase
puts 'HUH?! SPEAK UP, SONNY!'
else
puts "NO, NOT SINCE #{1930 + rand(21)}!"
end
talk = gets.chomp
end
puts 'OH VERY WELL, SEE YOU ANOTHER TIME, THEN!'
end
</code>

> Second question is... what if I wanted the program to require you
> to say
> "BYE" three times in a row instead of just three times throughout the
> conversation. Is there any easy way to do this?


Depends what you mean by easy. I don't think it would be difficult,
but it would require a fair amount of rewriting. Don't have the time
now to go into the details. I'm sorry.

Regards, Morton

William James

12/8/2007 11:43:00 AM

0

On Dec 7, 1:12 pm, Nigama Xx <niga...@gmail.com> wrote:
> Hello,
>
> I am just learning Ruby, via several resources (online: Why's,
> downloaded PDF's, and Chris Pine's book "Learn to Program Ruby"). I
> finished Chris Pine's book and was going back through doing any of the
> exercises I hadn't done the first time and trying to mess with/break the
> programs I had done the first time through.
>
> In looking back over my code and trying to clean things up, I managed to
> think of two good questions I can't seem to find the answer to
> elsewhere. I figured this was the brightest and smartest group of
> Ruby-heads out there. :)
>
> I'll ask my questions first and put the code from the program down
> below. The assignment asked us to create a "Deaf Grandmother" program,
> which you could only get out of by saying "BYE" to in all caps, three
> times.
>
> The first question I had was, for some reason, if you input "BYE!" for
> the second or third required "BYE" (to exit/end the program), it
> launches into an infinite loop. Why is that? BYE works correctly.
> What is it about "BYE!"?
>
> Second question is... what if I wanted the program to require you to say
> "BYE" three times in a row instead of just three times throughout the
> conversation. Is there any easy way to do this?
>
> Okay, thanks for your time, the code from the program is below..
>
> [code]
> talk = 'I <3 my grandmother'
> puts 'WHAT A FINE YOUNG GRANDCHILD YOU ARE, COME TO VISIT YOUR DEAR OLD
> GRANNY! COME IN, COME IN!'
>
> while talk != 'BYE'
> talk = gets.chomp
> if talk != talk.upcase
> puts 'HUH?! SPEAK UP, SONNY!'
> elsif talk == talk.upcase && talk != 'BYE'
> year = 1
> while year < 30
> year = rand(51)
> end
> puts 'NO, NOT SINCE 19' + year.to_s + '!'
> end
> end
>
> if talk == 'BYE'
> puts 'WHAT WAS THAT?'
> talk = gets.chomp
> while talk != 'BYE'
> if talk != talk.upcase
> puts 'HUH?! SPEAK UP, SONNY!'
> elsif talk == talk.upcase && talk != 'BYE'
> year = 1
> while year < 30
> year = rand(51)
> end
> puts 'NO, NOT SINCE 19' + year.to_s + '!'
> end
> end
>
> if talk == 'BYE'
> puts 'EYE? WHAT\'S WRONG WITH YOUR EYE?'
> talk = gets.chomp
> while talk != 'BYE'
> if talk != talk.upcase
> puts 'HUH?! SPEAK UP, SONNY!'
> elsif talk == talk.upcase && talk != 'BYE'
> year = 1
> while year < 30
> year = rand(51)
> end
> puts 'NO, NOT SINCE 19' + year.to_s + '!'
> end
> end
>
> if talk == 'BYE'
> puts 'OH VERY WELL, SEE YOU ANOTHER TIME, THEN!'
> end
> end
> end
> [/code]
> --
> Posted viahttp://www.ruby-....


history = []
bye_replies = [
'WHAT WAS THAT?',
"EYE? WHAT'S WRONG WITH YOUR EYE?"
]

puts 'WHAT A FINE YOUNG GRANDCHILD YOU ARE, COME TO VISIT
YOUR DEAR OLD GRANNY! COME IN, COME IN!'

bye_count = 0

while true
talk = gets.strip
history << talk

if talk != talk.upcase
puts 'HUH?! SPEAK UP, SONNY!'
elsif "BYE" == talk
break if ['BYE'] * 3 == history[ -3 .. -1 ]
puts bye_replies[ bye_count % bye_replies.size ]
bye_count += 1
else
year = rand( 21 ) + 30
puts "NO, NOT SINCE 19#{ year }!"
end
end

puts 'OH VERY WELL, SEE YOU ANOTHER TIME, THEN!'