# Ruby Nuby Question

**URL:** <https://www.ruby-forum.com/t/ruby-nuby-question/122462>\
**Category:** Ruby\
**Created:** [December 7, 2007, 8:12pm UTC](https://www.ruby-forum.com/t/ruby-nuby-question/122462 "2007-12-07T20:12:31Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![nigama](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/dc4da7/32.png) [@nigama](https://www.ruby-forum.com/u/nigama)\
**Post date:** [December 7, 2007, 8:12pm UTC](https://www.ruby-forum.com/t/ruby-nuby-question/122462/1 "2007-12-07T20:12:31Z")

</div>

Hello,

I am just learning Ruby, via several resources (online: Why’s,  
downloaded PDF’s, and Chris P.'s book “Learn to Program Ruby”). I  
finished Chris P.'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…

```auto
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
```

---

<div class="post-metadata">

**Author:** ![nigama](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/dc4da7/32.png) [@nigama](https://www.ruby-forum.com/u/nigama)\
**Post date:** [December 8, 2007, 3:26am UTC](https://www.ruby-forum.com/t/ruby-nuby-question/122462/2 "2007-12-08T03:26:37Z")

</div>

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!”?

> ```
> 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.

`
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
`

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

`
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
`

> 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

---

<div class="post-metadata">

**Author:** ![nigama](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/dc4da7/32.png) [@nigama](https://www.ruby-forum.com/u/nigama)\
**Post date:** [December 8, 2007, 12:46pm UTC](https://www.ruby-forum.com/t/ruby-nuby-question/122462/3 "2007-12-08T12:46:02Z")

</div>

On Dec 7, 1:12 pm, Nigama Xx [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> elsewhere. I figured this was the brightest and smartest group of  
> What is it about “BYE!”?  
> GRANNY! COME IN, COME IN!’  
> puts ‘NO, NOT SINCE 19’ + year.to\_s + ‘!’  
> year = 1  
> while talk != ‘BYE’
> 
> ```
> if talk == 'BYE'
> puts 'OH VERY WELL, SEE YOU ANOTHER TIME, THEN!'
> end
> 
> ```
> 
> ## end end [/code]
> 
> Posted viahttp://www.ruby-forum.com/.

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!’
