Fl4m3Ph03n1x
Exercism.io Secret handshake exercise?
I am doing some exercises while learning Elixir using Exercism.io.
Now, my objective is to do all exercises, extras included. This should give me a good grasp of the power of the language.
However I am having trouble. I don’t quite understand what some exercises want me to do, but I refuse to skip them either. One of these exercises is the following:
Introduction
There are 10 types of people in the world: Those who understand binary, and those who don’t.
You and your fellow cohort of those in the “know” when it comes to binary decide to come up with a secret “handshake”.
1 = wink 10 = double blink 100 = close your eyes 1000 = jump 10000 = Reverse the order of the operations in the secret handshake.Given a decimal number, convert it to the appropriate sequence of events for a secret handshake.
Here’s a couple of examples:
Given the input 3, the function would return the array [“wink”, “double blink”] because 3 is 11 in binary.
Given the input 19, the function would return the array [“double blink”, “wink”] because 19 is 10011 in binary. Notice that the addition of 16 (10000 in binary) has caused the array to be reversed.
use Bitwise (or div/rem)
If you use Bitwise, an easy way to see if a particular bit is set is to compare the binary AND (
&&&) of a set of bits with the particular bit pattern you want to check, and determine if the result is the same as the pattern you’re checking.Example:
Flags: 0b11011 Check: 0b11010
Flags &&& Check: 0b11010 (All checked bits are set)
Another:
Flags: 0b11011 Check: 0b10110
Flags &&& Check: 0b10010 (Third bit not set)
Question
Could someone help me understand why 11 translates to ["wink", "double blink"] instead of translating to ["wink", "wink"] ? ( it has two 1, right ? )
I know I am missing something rather basic but I just can see what.
Most Liked
peerreynders
since modulo arithmetic applies and is even tested AFAIR.
Was there an allusion to how values greater than 31 are treated? What if I want ["wink","jump","wink"]? Frankly this is where I find these type of questions frustrating as the context seems to be oblivious to a lot of the unstated assumptions/constraints.
kip
This is another one that is quite fun with binary pattern matching ![]()
defmodule Secret do
def handshake(number) when is_integer(number) do
handshake(<< number :: size(5) >>)
end
@code ["jump", "close your eyes", "double blink", "wink"]
def handshake(<< reverse :: size(1), jump :: size(1), close :: size(1), double :: size(1), wink :: size(1) >>) do
shake =
[jump, close, double, wink]
|> Enum.zip(@code)
|> Enum.reduce([], fn
{0, _}, acc -> acc
{1, item}, acc -> [item | acc]
end)
# Since Enum.reduce/3 returns the list in reverse order,
# we only reverse if the reverse bit is not set :-)
if reverse == 1, do: shake, else: Enum.reverse(shake)
end
end
iex> Secret.handshake 3
["wink", "double blink"]
hex> Secret.handshake 0b00111
["close your eyes", "double blink", "wink"]
iex> Secret.handshake 0b10111
["wink", "double blink", "close your eyes"]
Popular in Chat/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
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








