blackened
Trying to understand certain concepts through a Mastermind game sub-problem
I am a complete Elixir beginner. I am trying to understand certain concepts with the following Mastermind sub-problem.
Suppose I have two lists code = [0, 3, 2 ,3, 4, 5] and guess = [0, 4, 2, 4, 3, 3].
My approach is, we compare the two lists and assign two values, one for both correct guess and position (CP), and the other for correct guess but for wrong position (CG). In the above example: CP is 2 (the first and third guess), and the CG is 3 (two 3s and one 4).
I guess there are numerous ways to approach. What I wanted to achieve was this: We traverse the two lists to determine correct positional guesses and produce two new lists. For the above example, that would be:
[:true, 3, :true, 3, 4, 5] and [:true, 4, :true, 4, 3, 3]
Then, we traverse the two lists for the second time and produce a third list, such that we take each item from the new guess list and check if the code list contains it. If so, the new list returns, say, :guess for those guesses. So the third list will be:
[:true, :guess, :true, :guess, :guess: 5] and [:true, :ok, :true, 4, :ok, :ok]
And now we count the :true, and :guess.
- What is the Elixir way to produce the second list and the third list.
- How else can I approach it anyway (again, in an idiomatic Elixir way)?
Most Liked
Sebb
Nice problem to learn some Enum functions.
The ‘CP’ problem can easily be solved with zip
{cps, other} = Enum.zip(code, guess) |> Enum.split_with(fn {c,g} -> c == g end)
cp = length(cps)
‘CG’ is a little more involved, there are several functions in Enum one could use. There is most likely some better approach, but for example this seems to work:
{code, guess} = Enum.unzip(other)
code_freqs = Enum.frequencies(code)
guess_freqs = Enum.frequencies(guess)
cg = Enum.reduce(guess_freqs, 0, fn {guess, guess_freq}, score ->
code_freq = Map.get(code_freqs, guess, 0)
score + Enum.min([code_freq, guess_freq])
end)
Have a look at the other functions in Enum. Try to solve 'CG" without the help of frequencies.
This may help: Elixir Enum Cheatsheet
Last Post!
matt-savvy
I just had a thought and I’m pretty sure you can do this to get the remaining correct guesses (as in, right number, wrong place)
defp get_correct_guesses(remaining_guess, remaining_code) do
(remaining_guess -- remaining_code) |> Enum.map(fn _ -> :correct_guess end)
end
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security










