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