93 lines
2.2 KiB
Markdown
93 lines
2.2 KiB
Markdown
|
# Secret Handshake
|
||
|
|
||
|
> 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".
|
||
|
|
||
|
```text
|
||
|
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)
|
||
|
|
||
|
|
||
|
## Running tests
|
||
|
|
||
|
Execute the tests with:
|
||
|
|
||
|
```bash
|
||
|
$ elixir secret_handshake_test.exs
|
||
|
```
|
||
|
|
||
|
### Pending tests
|
||
|
|
||
|
In the test suites, all but the first test have been skipped.
|
||
|
|
||
|
Once you get a test passing, you can unskip the next one by
|
||
|
commenting out the relevant `@tag :pending` with a `#` symbol.
|
||
|
|
||
|
For example:
|
||
|
|
||
|
```elixir
|
||
|
# @tag :pending
|
||
|
test "shouting" do
|
||
|
assert Bob.hey("WATCH OUT!") == "Whoa, chill out!"
|
||
|
end
|
||
|
```
|
||
|
|
||
|
Or, you can enable all the tests by commenting out the
|
||
|
`ExUnit.configure` line in the test suite.
|
||
|
|
||
|
```elixir
|
||
|
# ExUnit.configure exclude: :pending, trace: true
|
||
|
```
|
||
|
|
||
|
For more detailed information about the Elixir track, please
|
||
|
see the [help page](http://exercism.io/languages/elixir).
|
||
|
|
||
|
## Source
|
||
|
|
||
|
Bert, in Mary Poppins [http://www.imdb.com/title/tt0058331/quotes/qt0437047](http://www.imdb.com/title/tt0058331/quotes/qt0437047)
|
||
|
|
||
|
## Submitting Incomplete Solutions
|
||
|
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|