Skip to content

Instantly share code, notes, and snippets.

@nuclearsandwich
Created May 26, 2012 18:55
Show Gist options
  • Save nuclearsandwich/2794932 to your computer and use it in GitHub Desktop.
Save nuclearsandwich/2794932 to your computer and use it in GitHub Desktop.
class GuessRange
attr_accessor :min, :max
def initialize min, max
@min, @max = min, max
end
def average
(min + max) / 2
end
alias_method :mean, :average
end
class BinarySearchGuesser
def initialize range
@range = range
end
def guess
@guess = @range.average
end
def too_low!
@range.min = guess + 1
end
def too_high!
@range.max = guess - 1
end
def max_guesses_required
Math.log2(@range.max - @range.min).ceil
end
end
class GuessingGame
def initialize range = 1..100
@guesser = BinarySearchGuesser.new GuessRange.new range.min, range.max
end
def play!
puts "I think I can get it in at most #{@guesser.max_guesses_required} tries."
@guesser.max_guesses_required.times do
make_a_guess!
break if get_feedback! == :won
end
end
def make_a_guess!
puts "I guess #{@guesser.guess}"
end
def taunt_or_flaunt!
puts "Well well, it was pretty easy, I have to admit."
end
def get_feedback!
loop do # Loop until they say something sensible.
print "Am I high or low? Did I win? "
case gets.chomp
when /high/
@guesser.too_high!
return :too_high
when /low/
@guesser.too_low!
return :too_low
when /w[io]n/
taunt_or_flaunt!
return :won
else
puts "That didn't make any sense, try usin' English."
end
end
end
end
GuessingGame.new.play!
@loveybot
Copy link

Yay Ruby!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment