Bulls and cows: Difference between revisions

Content added Content deleted
(Added Elixir)
Line 780: Line 780:
}
}
</lang>
</lang>

=={{header|Clojure}}==
=={{header|Clojure}}==
<lang clojure>
<lang clojure>
Line 1,064: Line 1,065:
}, entropy)
}, entropy)
}</lang>
}</lang>

=={{header|Eiffel}}==
=={{header|Eiffel}}==
<lang Eiffel>
<lang Eiffel>
Line 1,302: Line 1,304:
Your Guess #6 ?2843
Your Guess #6 ?2843
Congratulations! You have won!
Congratulations! You have won!
</pre>

=={{header|Elixir}}==
{{works with|Elixir|1.2}}
<lang elixir>defmodule Bulls_and_cows do
def play(size \\ 4) do
secret = Enum.take_random(1..9, size) |> Enum.map(&to_string/1)
play(size, secret)
end
defp play(size, secret) do
guess = input(size)
if guess == secret do
IO.puts "You win!"
else
{bulls, cows} = count(guess, secret)
IO.puts " Bulls: #{bulls}; Cows: #{cows}"
play(size, secret)
end
end
defp input(size) do
guess = IO.gets("Enter your #{size}-digit guess: ") |> String.strip
cond do
guess == "" ->
IO.puts "Give up"
exit(:normal)
String.length(guess)==size and String.match?(guess, ~r/^[1-9]+$/) ->
String.codepoints(guess)
true -> input(size)
end
end
defp count(guess, secret) do
Enum.zip(guess, secret) |>
Enum.reduce({0,0}, fn {g,s},{bulls,cows} ->
cond do
g == s -> {bulls + 1, cows}
g in secret -> {bulls, cows + 1}
true -> {bulls, cows}
end
end)
end
end

Bulls_and_cows.play</lang>

{{out}}
<pre>
Enter your 4-digit guess: 1234
Bulls: 1; Cows: 1
Enter your 4-digit guess: 5678
Bulls: 0; Cows: 2
Enter your 4-digit guess: 2345
Bulls: 0; Cows: 1
Enter your 4-digit guess: 1456
Bulls: 1; Cows: 0
Enter your 4-digit guess: 1782
You win!
</pre>
</pre>