user6123563
user6123563

Reputation:

gets.chomp three times in a row to exit

The task is taken from "Learn to Program" by Chrise Pine. The program is called 'Deaf Grandma'. Here's the task: "whatever you type, grandma (the program) should respond with this:

    `HUH?! SPEAK UP, SONNY!`

unless you shout it (type in all capitals). In this case she responds with:

    `NO, NOT SINCE 1938!`

Have Grandma shout a different year each time, maybe any year at random between 1930 and 1950. You have to shout BYE three times in a row. Make sure to test your program: if you shout BYE three times but not in a row, you should still be talking to Grandma." Now, everything looks fine to me, except I didn't get where to put gets.chomp 3 times to exit a program. Eventually, I came up with this:

    speak = gets.chomp 
     while speak != 'BYE' 
       puts 'HUH?! SPEAK UP, SONNY!'
     if speak == speak.upcase
       puts 'NO, NOT SINCE ' + (1930 + rand(20)).to_s + '!'
     else repeat = gets.chomp
     end
    end

But in this case if I type BYE grandma still asks me:

    `HUH?! SPEAK UP, SONNY!`

My question is: how can I properly make the program exit after I type BYE three times in a row?

Upvotes: 2

Views: 373

Answers (4)

moa
moa

Reputation: 1

puts "what can i do for your son?"
a=0
while a != 3
n= gets.chomp
  if n.include? 'BYE'
    puts "NO NOT SINCE  #{rand(1897..1930)}".chomp
    a = (a + 1)
  end
  if n != n.upcase
    puts 'HUH?!  SPEAK UP, SONNY!'.chomp
    a=0 
  end
  if n == n.upcase and n != 'BYE'
    puts "NO NOT SINCE  #{rand(1897..1930)}".chomp
    a=0
  end
end

Upvotes: 0

Cary Swoveland
Cary Swoveland

Reputation: 110685

Here's another way:

responses = ["", "", ""]

loop do
  speak = gets.chomp
  responses.shift
  responses << speak
  break if responses.all? { |r| r == "BYE" }
  if speak == speak.upcase
    puts 'NO, NOT SINCE ' + (1930 + rand(20)).to_s + '!'
  else
    puts 'HUH?! SPEAK UP, SONNY!'
  end
end

Alternatively,

break if responses.uniq == ["BYE"]

Upvotes: 1

LiamOnRails
LiamOnRails

Reputation: 48

You've not added anywhere in your code that using 'bye' 3 times will exit the program.

while bye < 3

Try looking at your code again and implementing the changes to exit after 3 byes.

Upvotes: 1

Alfie
Alfie

Reputation: 2784

Have a look at this, I've made some changes though. But should give you the expected output.

bye_count = 0
while true
  speak = gets.chomp
  if speak == 'BYE'
    bye_count +=1
    bye_count == 3 ? break : next
  end
  bye_count = 0 # Resets count
  if speak == speak.upcase
    puts 'NO, NOT SINCE ' + (1930 + rand(20)).to_s + '!'
  else
    puts 'HUH?! SPEAK UP, SONNY!'
  end
end

Upvotes: 1

Related Questions