From 8fbe3adc8b5254e553637add4679591782277164 Mon Sep 17 00:00:00 2001 From: Glenn Jackman Date: Wed, 18 Mar 2026 08:32:38 -0400 Subject: [PATCH] Add secret-handshake --- config.json | 24 +++++--- exercises/practice/secret-handshake/.busted | 5 ++ .../secret-handshake/.docs/instructions.md | 48 ++++++++++++++++ .../secret-handshake/.docs/introduction.md | 7 +++ .../secret-handshake/.meta/config.json | 19 +++++++ .../secret-handshake/.meta/example.moon | 18 ++++++ .../.meta/spec_generator.moon | 16 ++++++ .../secret-handshake/.meta/tests.toml | 43 ++++++++++++++ .../secret-handshake/secret_handshake.moon | 4 ++ .../secret_handshake_spec.moon | 57 +++++++++++++++++++ 10 files changed, 233 insertions(+), 8 deletions(-) create mode 100644 exercises/practice/secret-handshake/.busted create mode 100644 exercises/practice/secret-handshake/.docs/instructions.md create mode 100644 exercises/practice/secret-handshake/.docs/introduction.md create mode 100644 exercises/practice/secret-handshake/.meta/config.json create mode 100644 exercises/practice/secret-handshake/.meta/example.moon create mode 100644 exercises/practice/secret-handshake/.meta/spec_generator.moon create mode 100644 exercises/practice/secret-handshake/.meta/tests.toml create mode 100644 exercises/practice/secret-handshake/secret_handshake.moon create mode 100644 exercises/practice/secret-handshake/secret_handshake_spec.moon diff --git a/config.json b/config.json index 54eb20b..be183d8 100644 --- a/config.json +++ b/config.json @@ -178,14 +178,6 @@ "prerequisites": [], "difficulty": 2 }, - { - "slug": "rotational-cipher", - "name": "Rotational Cipher", - "uuid": "365fb81f-c059-4231-954b-bac1878e2a0c", - "practices": [], - "prerequisites": [], - "difficulty": 3 - }, { "slug": "rna-transcription", "name": "RNA Transcription", @@ -346,6 +338,14 @@ "prerequisites": [], "difficulty": 3 }, + { + "slug": "rotational-cipher", + "name": "Rotational Cipher", + "uuid": "365fb81f-c059-4231-954b-bac1878e2a0c", + "practices": [], + "prerequisites": [], + "difficulty": 3 + }, { "slug": "scrabble-score", "name": "Scrabble Score", @@ -354,6 +354,14 @@ "prerequisites": [], "difficulty": 3 }, + { + "slug": "secret-handshake", + "name": "Secret Handshake", + "uuid": "cf4561c6-c986-4136-8247-b3318cb54cd2", + "practices": [], + "prerequisites": [], + "difficulty": 3 + }, { "slug": "space-age", "name": "Space Age", diff --git a/exercises/practice/secret-handshake/.busted b/exercises/practice/secret-handshake/.busted new file mode 100644 index 0000000..86b84e7 --- /dev/null +++ b/exercises/practice/secret-handshake/.busted @@ -0,0 +1,5 @@ +return { + default = { + ROOT = { '.' } + } +} diff --git a/exercises/practice/secret-handshake/.docs/instructions.md b/exercises/practice/secret-handshake/.docs/instructions.md new file mode 100644 index 0000000..d2120b9 --- /dev/null +++ b/exercises/practice/secret-handshake/.docs/instructions.md @@ -0,0 +1,48 @@ +# Instructions + +Your task is to convert a number between 1 and 31 to a sequence of actions in the secret handshake. + +The sequence of actions is chosen by looking at the rightmost five digits of the number once it's been converted to binary. +Start at the right-most digit and move left. + +The actions for each number place are: + +```plaintext +00001 = wink +00010 = double blink +00100 = close your eyes +01000 = jump +10000 = Reverse the order of the operations in the secret handshake. +``` + +Let's use the number `9` as an example: + +- 9 in binary is `1001`. +- The digit that is farthest to the right is 1, so the first action is `wink`. +- Going left, the next digit is 0, so there is no double-blink. +- Going left again, the next digit is 0, so you leave your eyes open. +- Going left again, the next digit is 1, so you jump. + +That was the last digit, so the final code is: + +```plaintext +wink, jump +``` + +Given the number 26, which is `11010` in binary, we get the following actions: + +- double blink +- jump +- reverse actions + +The secret handshake for 26 is therefore: + +```plaintext +jump, double blink +``` + +~~~~exercism/note +If you aren't sure what binary is or how it works, check out [this binary tutorial][intro-to-binary]. + +[intro-to-binary]: https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa +~~~~ diff --git a/exercises/practice/secret-handshake/.docs/introduction.md b/exercises/practice/secret-handshake/.docs/introduction.md new file mode 100644 index 0000000..176b92e --- /dev/null +++ b/exercises/practice/secret-handshake/.docs/introduction.md @@ -0,0 +1,7 @@ +# Introduction + +You are starting a secret coding club with some friends and friends-of-friends. +Not everyone knows each other, so you and your friends have decided to create a secret handshake that you can use to recognize that someone is a member. +You don't want anyone who isn't in the know to be able to crack the code. + +You've designed the code so that one person says a number between 1 and 31, and the other person turns it into a series of actions. diff --git a/exercises/practice/secret-handshake/.meta/config.json b/exercises/practice/secret-handshake/.meta/config.json new file mode 100644 index 0000000..3ea1730 --- /dev/null +++ b/exercises/practice/secret-handshake/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "glennj" + ], + "files": { + "solution": [ + "secret_handshake.moon" + ], + "test": [ + "secret_handshake_spec.moon" + ], + "example": [ + ".meta/example.moon" + ] + }, + "blurb": "Given a decimal number, convert it to the appropriate sequence of events for a secret handshake.", + "source": "Bert, in Mary Poppins", + "source_url": "https://www.imdb.com/title/tt0058331/quotes/?item=qt0437047" +} diff --git a/exercises/practice/secret-handshake/.meta/example.moon b/exercises/practice/secret-handshake/.meta/example.moon new file mode 100644 index 0000000..605a06f --- /dev/null +++ b/exercises/practice/secret-handshake/.meta/example.moon @@ -0,0 +1,18 @@ +actions = {'wink', 'double blink', 'close your eyes', 'jump'} + +-- reverse a table _in-place_ +treverse = (t) -> + i, j = 1, #t + while i < j + t[i], t[j] = t[j], t[i] + i += 1 + j -= 1 + +{ + commands: (value) -> + return {} unless value > 0 + result = [a for i, a in ipairs actions when (value >> (i-1)) & 1 == 1] + treverse result if (value >> #actions) & 1 == 1 + result +} + diff --git a/exercises/practice/secret-handshake/.meta/spec_generator.moon b/exercises/practice/secret-handshake/.meta/spec_generator.moon new file mode 100644 index 0000000..d33e9a0 --- /dev/null +++ b/exercises/practice/secret-handshake/.meta/spec_generator.moon @@ -0,0 +1,16 @@ +list_of_strings = (list) -> + "{#{table.concat [quote word for word in *list], ', '}}" + +{ + module_name: 'SecretHandshake', + + generate_test: (case, level) -> + local lines + -- you may want to "switch case.property" here + lines = { + "result = SecretHandshake.#{case.property} #{case.input.number}", + "expected = #{list_of_strings case.expected}", + "assert.are.same expected, result" + } + table.concat [indent line, level for line in *lines], '\n' +} diff --git a/exercises/practice/secret-handshake/.meta/tests.toml b/exercises/practice/secret-handshake/.meta/tests.toml new file mode 100644 index 0000000..f318e52 --- /dev/null +++ b/exercises/practice/secret-handshake/.meta/tests.toml @@ -0,0 +1,43 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[b8496fbd-6778-468c-8054-648d03c4bb23] +description = "wink for 1" + +[83ec6c58-81a9-4fd1-bfaf-0160514fc0e3] +description = "double blink for 10" + +[0e20e466-3519-4134-8082-5639d85fef71] +description = "close your eyes for 100" + +[b339ddbb-88b7-4b7d-9b19-4134030d9ac0] +description = "jump for 1000" + +[40499fb4-e60c-43d7-8b98-0de3ca44e0eb] +description = "combine two actions" + +[9730cdd5-ef27-494b-afd3-5c91ad6c3d9d] +description = "reverse two actions" + +[0b828205-51ca-45cd-90d5-f2506013f25f] +description = "reversing one action gives the same action" + +[9949e2ac-6c9c-4330-b685-2089ab28b05f] +description = "reversing no actions still gives no actions" + +[23fdca98-676b-4848-970d-cfed7be39f81] +description = "all possible actions" + +[ae8fe006-d910-4d6f-be00-54b7c3799e79] +description = "reverse all possible actions" + +[3d36da37-b31f-4cdb-a396-d93a2ee1c4a5] +description = "do nothing for zero" diff --git a/exercises/practice/secret-handshake/secret_handshake.moon b/exercises/practice/secret-handshake/secret_handshake.moon new file mode 100644 index 0000000..d38d5ac --- /dev/null +++ b/exercises/practice/secret-handshake/secret_handshake.moon @@ -0,0 +1,4 @@ +{ + commands: (value) -> + error 'Implement me' +} diff --git a/exercises/practice/secret-handshake/secret_handshake_spec.moon b/exercises/practice/secret-handshake/secret_handshake_spec.moon new file mode 100644 index 0000000..9bd6d3b --- /dev/null +++ b/exercises/practice/secret-handshake/secret_handshake_spec.moon @@ -0,0 +1,57 @@ +SecretHandshake = require 'secret_handshake' + +describe 'secret-handshake', -> + it 'wink for 1', -> + result = SecretHandshake.commands 1 + expected = {'wink'} + assert.are.same expected, result + + pending 'double blink for 10', -> + result = SecretHandshake.commands 2 + expected = {'double blink'} + assert.are.same expected, result + + pending 'close your eyes for 100', -> + result = SecretHandshake.commands 4 + expected = {'close your eyes'} + assert.are.same expected, result + + pending 'jump for 1000', -> + result = SecretHandshake.commands 8 + expected = {'jump'} + assert.are.same expected, result + + pending 'combine two actions', -> + result = SecretHandshake.commands 3 + expected = {'wink', 'double blink'} + assert.are.same expected, result + + pending 'reverse two actions', -> + result = SecretHandshake.commands 19 + expected = {'double blink', 'wink'} + assert.are.same expected, result + + pending 'reversing one action gives the same action', -> + result = SecretHandshake.commands 24 + expected = {'jump'} + assert.are.same expected, result + + pending 'reversing no actions still gives no actions', -> + result = SecretHandshake.commands 16 + expected = {} + assert.are.same expected, result + + pending 'all possible actions', -> + result = SecretHandshake.commands 15 + expected = {'wink', 'double blink', 'close your eyes', 'jump'} + assert.are.same expected, result + + pending 'reverse all possible actions', -> + result = SecretHandshake.commands 31 + expected = {'jump', 'close your eyes', 'double blink', 'wink'} + assert.are.same expected, result + + pending 'do nothing for zero', -> + result = SecretHandshake.commands 0 + expected = {} + assert.are.same expected, result