2017-11-12 2 views
0

사람이 'BYE'을 3 번 연속 호출 할 때까지 실행되는 코드를 만들려고합니다. 다음 코드와while 루프의 반복자가 예상보다 한 번 더 실행됩니다.

는 :

ask = gets.chomp 
count = 0 
while (count != 3) 
    if (ask == 'BYE') 
    puts 'HUH?! SPEAK UP, SONNY!' 
    count = count + 1 
    ask = gets.chomp 
    elsif (ask != ask.upcase) 
    puts 'HUH?! SPEAK UP, SONNY!' 
    count = 0 
    ask = gets.chomp 
    else 
    puts 'NO, NOT SINCE ' + rand(1930..1950).to_s + '!' 
    count = 0 
    ask = gets.chomp 
    end 
end 
puts 'Goodbye for now' 

사실 'BYE' 네 번 입력해야합니다. 누군가 그것을 고칠 수있는 방법을 가리킬 수 있습니까?

+0

당신은 이해한다 0이, 1,2,3은 4 배입니다. c orrect? – engineersmnky

답변

1

실제로 BYE를 네 번 입력하지 않아도됩니다. 세 명이면 충분합니다. 네 번째 입력은 무엇이든 가능합니다.

BYE # input 1 
HUH?! SPEAK UP, SONNY! 
BYE # input 2 
HUH?! SPEAK UP, SONNY! 
BYE # input 3 
HUH?! SPEAK UP, SONNY! 
nah, I give up # input 4 
Goodbye for now 

코드 문제는 처리기를 선택한 직후에 다음 입력을 요청한다는 것입니다. 당신의 논리에 따르면, 당신은 그 입력을 필요로하지 않을지라도. 따라서이 부분을 다시 작성해야합니다.

0

귀하의 while (count != 3)은 Rubishque 솔루션을 작성하는 데 저항 할 수 없을 정도로 자바 (Ruby의 괄호는 필요 없습니다)입니다. 더 짧지는 않지만 DRY는 Ruby 프로그램에서 볼 수있는 코드가 많으며 분명히 모범적이지는 않습니다. Ruby에서 동일한 작업을 수행하는 방법은 항상 여러 가지가 있습니다.

class Strange 
    def initialize(wanted) 
     @answer = true 
     @count = 0 
     @wanted = wanted # desired number of correct consecutive answers 
    end 

     # Increment @count if true, else reset to zero. 
    def answer(boolean) 
     @answer = boolean 

     if boolean 
     then # then is optional, but I like it 
      @count = @count + 1 
     else 
      @count = 0 
     end 
    end 

     # Write a message. 
    def message(number) 
     puts case number 
     when 1 then 'HUH?! SPEAK UP, SONNY!' 
     when 2 then "NO, NOT SINCE #{rand(1930..1950)} !" 
     else 'WHAT ?' 
     end 
    end 

    def prompt 
     print @answer ? 'Talk please > ' : 'Wrong answer, retry > ' 
     @ask = gets.chomp 
    end 

     # Recursively loop until the number of correct consecutive answers 
     # corresponds to the desired number. 
    def run 
     prompt 

     case 
     when @ask == 'BYE' 
      message 1 
      answer(true) 
     when @ask != @ask.upcase 
      message 1 
      answer(false) 
     else 
      message 2 
      answer(false) 
     end 

     run unless @count == @wanted # recursive loop 
    end 
end # class Strange 

Strange.new(3).run 

puts 'Goodbye for now' 

가 실행 :

$ ruby -w t.rb 
Talk please > xyz 
HUH?! SPEAK UP, SONNY! 
Wrong answer, retry > XYZ 
NO, NOT SINCE 1935 ! 
Wrong answer, retry > BYE 
HUH?! SPEAK UP, SONNY! 
Talk please > what ? 
HUH?! SPEAK UP, SONNY! 
Wrong answer, retry > BYE 
HUH?! SPEAK UP, SONNY! 
Talk please > BYE 
HUH?! SPEAK UP, SONNY! 
Talk please > BYE 
HUH?! SPEAK UP, SONNY! 
Goodbye for now 
+0

제어 흐름에 3 진을 사용하지 마십시오. :) –

+0

@SergioTulentsev 어느 것? 코드 냄새입니까? – BernardK

+0

나는 그것을 코드 냄새라고 생각한다. (루비 스타일 가이드에서 찾을 수는 없지만). 제 추론은 이것입니다 : 삼항 연산자는 "표현"입니다. 부작용을 일으키는 것이 주 목적 인 표현을 갖는 것은 이상합니다. 네, 기술적으로 루비의'if'도 표현식입니다 만, 제어 흐름 문처럼 보이기 때문에 다른 메시지를 전달합니다. –

1

루프의 시작 부분에 한 번만 gets 퍼팅이 그것을 해결

count = 0 

while count != 3 
    ask = gets.chomp 

    if ask == 'BYE' 
     puts 'HUH?! SPEAK UP, SONNY!' 
     count = count + 1 
    elsif ask != ask.upcase 
     puts 'HUH?! SPEAK UP, SONNY!' 
     count = 0 
    else 
     puts 'NO, NOT SINCE ' + rand(1930..1950).to_s + '!' 
     count = 0 
    end 
end 

puts 'Goodbye for now' 

가 실행 :

$ ruby -w topc.rb 
a 
HUH?! SPEAK UP, SONNY! 
A 
NO, NOT SINCE 1931! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYEE 
NO, NOT SINCE 1939! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYE 
HUH?! SPEAK UP, SONNY! 
Goodbye for now