Skip to content

Instantly share code, notes, and snippets.

@tintoy
Last active January 10, 2016 01:16
Show Gist options
  • Save tintoy/aa399ad4d86624ed0afa to your computer and use it in GitHub Desktop.
Save tintoy/aa399ad4d86624ed0afa to your computer and use it in GitHub Desktop.
Quick-and-dirty guess the number implementation in Elixir
defmodule Guess do
@moduledoc """
Number guessing game module.
"""
@doc """
Guess the supplied `secret` by recursively bisecting the specified number `range`.
"""
def guess(secret, range = lo..hi) when lo <= hi do
_guess(_mid(range), secret, range)
end
@doc """
Guess the supplied `secret` by recursively bisecting the specified number `range`.
"""
def guess(secret, lo..hi) when lo > hi do
range = hi..lo
_guess(_mid(range), secret, range)
end
# Correct guess.
defp _guess(current_guess, current_guess, _) do
IO.puts("Guessed the secret! It was #{current_guess}.")
current_guess
end
# Incorrect guess, keep trying.
defp _guess(current_guess, secret, lo..hi) do
mid = _mid(lo..hi)
IO.puts("Current = #{current_guess}, Secret = #{secret}, Lo..Hi = #{lo}..#{hi}")
{next_guess, next_range} = cond do
secret <= mid -> {mid - lo, lo..mid}
secret > mid -> {hi - mid, mid..hi}
end
_guess(next_guess, secret, next_range)
end
# Get the middle value of the specified number range.
defp _mid(lo..hi) do
div(hi - lo, 2)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment