36 lines
867 B
Elixir
36 lines
867 B
Elixir
|
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 1 = wink
|
||
|
2 10 = double blink
|
||
|
4 100 = close your eyes
|
||
|
8 1000 = jump
|
||
|
|
||
|
16 10000 = Reverse the order of the operations in the secret handshake
|
||
|
"""
|
||
|
|
||
|
@coms %{
|
||
|
1 => "wink",
|
||
|
2 => "double blink",
|
||
|
4 => "close your eyes",
|
||
|
8 => "jump",
|
||
|
16 => "reverse"
|
||
|
}
|
||
|
|
||
|
@spec commands(code :: integer) :: list(String.t())
|
||
|
def commands(code) do
|
||
|
@coms
|
||
|
|> Map.keys()
|
||
|
|> Enum.reduce([], &if(Bitwise.band(code, &1) == &1, do: [@coms[&1] | &2], else: &2))
|
||
|
|> case do
|
||
|
["reverse" | tail] -> tail
|
||
|
reversed_list -> Enum.reverse(reversed_list)
|
||
|
end
|
||
|
end
|
||
|
end
|