lpvm
Exercism secred_handshake help list
I’ve built the following code (reverse not implemented) to solve the secret_handshake problem at exercism.io.
But the first test fails…
test Create a handshake for a number wink for 1 (SecretHandshakeTest)
secret_handshake_test.exs:13
Assertion with == failed
code: assert SecretHandshake.commands(1) == ["wink"]
left: ["wink", nil]
right: ["wink"]
stacktrace:
secret_handshake_test.exs:14: (test)
There’s a ["wink", nil] instead of a ["wink"] for the 1 case, and I can’t figure out why this is happening.
defmodule SecretHandshake do
@doc """
Determine the actions of a secret handshake based on the binary
representation of the given `code`.
If the following bits are set, include the corresponding action in your list
of commands, in order from lowest to highest.
1 = wink
10 = double blink
100 = close your eyes
1000 = jump
10000 = Reverse the order of the operations in the secret handshake
"""
@spec commands(code :: integer) :: list(String.t())
def commands(code) do
in_binary = decimalToBinary code
to_reverse = true and rem(code, 10000)
commands = []
commands = if div(in_binary, 1000) == 1, do: [getAction(1000)] ++ commands
commands = if div(in_binary, 100) == 1, do: [getAction(100)] ++ commands
commands = if div(in_binary, 10) == 1, do: [getAction(10)] ++ commands
commands = if rem(in_binary, 2) == 1, do: [getAction(1)] ++ commands
end
defp getAction(dec) do
case dec do
1 -> "wink"
10 -> "double blink"
100 -> "close your eyes"
1000 -> "jump"
end
end
defp decimalToBinary(dec) do
dec
|> Integer.to_string(2)
|> String.to_integer
end
end
Marked As Solved
NobbZ
Each of this lines will return nil from its implicit else branch.
I am not sure though, why your result is ["wink", nil], it should be ["wink" | nil].
You should try to do some other approach by creating a list of tuples, where the first element is the bit that has to be set, the other is the word to put in the command. Then you simply fold over that list.
Something like this:
[{0, "wink"}, {1, "double blink"}, {2, "close your eyes"}, {3, "jump"}]
|> Enum.fold([], fn {bit, cmd}, acc ->
if bit_set?(code, bit), do: [cmd | acc], else: acc
end)
|> Enum.reverse()
bit_set?/2 is easily implementable using the Bitwise module.
1
Popular in Questions
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
Hi all,
Trying to get some more clarity over utc_datetime and naive_datetime for Ecto:
https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this:
...
New
Student & New to elixir. Nice language.
I want to convert a english character, e.g. “a”, which is stored in a variable, to it’s asci...
New
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
Other popular topics
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
What is the idiomatic way of matching for not nil in Elixir?
E.g.,
First way:
defp halt_if_not_signed_in(conn, signed_in_account) when...
New
Hi there,
I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
As a follow up to my earlier question:
I have the code compiling and running but not getting a successful login from the rest server. ...
New
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
After calling mix ecto.create I get this error:
17:00:32.162 [error] GenServer #PID<0.412.0> terminating
** (Postgrex.Error) FATAL...
New
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New







