diff --git a/config.json b/config.json index 8c29591..d409070 100644 --- a/config.json +++ b/config.json @@ -50,6 +50,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "atbash-cipher", + "name": "Atbash Cipher", + "uuid": "dc112a08-5969-490e-8108-833f6f927cb2", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "collatz-conjecture", "name": "Collatz Conjecture", diff --git a/exercises/practice/atbash-cipher/.busted b/exercises/practice/atbash-cipher/.busted new file mode 100644 index 0000000..86b84e7 --- /dev/null +++ b/exercises/practice/atbash-cipher/.busted @@ -0,0 +1,5 @@ +return { + default = { + ROOT = { '.' } + } +} diff --git a/exercises/practice/atbash-cipher/.docs/instructions.md b/exercises/practice/atbash-cipher/.docs/instructions.md new file mode 100644 index 0000000..1e7627b --- /dev/null +++ b/exercises/practice/atbash-cipher/.docs/instructions.md @@ -0,0 +1,27 @@ +# Instructions + +Create an implementation of the Atbash cipher, an ancient encryption system created in the Middle East. + +The Atbash cipher is a simple substitution cipher that relies on transposing all the letters in the alphabet such that the resulting alphabet is backwards. +The first letter is replaced with the last letter, the second with the second-last, and so on. + +An Atbash cipher for the Latin alphabet would be as follows: + +```text +Plain: abcdefghijklmnopqrstuvwxyz +Cipher: zyxwvutsrqponmlkjihgfedcba +``` + +It is a very weak cipher because it only has one possible key, and it is a simple mono-alphabetic substitution cipher. +However, this may not have been an issue in the cipher's time. + +Ciphertext is written out in groups of fixed length, the traditional group size being 5 letters, leaving numbers unchanged, and punctuation is excluded. +This is to make it harder to guess things based on word boundaries. +All text will be encoded as lowercase letters. + +## Examples + +- Encoding `test` gives `gvhg` +- Encoding `x123 yes` gives `c123b vh` +- Decoding `gvhg` gives `test` +- Decoding `gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt` gives `thequickbrownfoxjumpsoverthelazydog` diff --git a/exercises/practice/atbash-cipher/.meta/config.json b/exercises/practice/atbash-cipher/.meta/config.json new file mode 100644 index 0000000..d932c41 --- /dev/null +++ b/exercises/practice/atbash-cipher/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "atbash_cipher.moon" + ], + "test": [ + "atbash_cipher_spec.moon" + ], + "example": [ + ".meta/example.moon" + ] + }, + "blurb": "Create an implementation of the Atbash cipher, an ancient encryption system created in the Middle East.", + "source": "Wikipedia", + "source_url": "https://en.wikipedia.org/wiki/Atbash" +} diff --git a/exercises/practice/atbash-cipher/.meta/example.moon b/exercises/practice/atbash-cipher/.meta/example.moon new file mode 100644 index 0000000..f8b5a8c --- /dev/null +++ b/exercises/practice/atbash-cipher/.meta/example.moon @@ -0,0 +1,13 @@ +{ + encode: (phrase) -> + clean = phrase\lower!\gsub "[^a-z0-9]", "" + decoded = clean\gsub "[a-z]", (letter) -> + string.char 219 - letter\byte! + spaced = decoded\gsub(".....", "%0 ") + spaced\match("^%s*(.-)%s*$") or spaced + + decode: (phrase) -> + clean = phrase\lower!\gsub "[^a-z0-9]", "" + clean\gsub "[a-z]", (letter) -> + string.char 219 - letter\byte! +} diff --git a/exercises/practice/atbash-cipher/.meta/spec_generator.moon b/exercises/practice/atbash-cipher/.meta/spec_generator.moon new file mode 100644 index 0000000..1a53d8d --- /dev/null +++ b/exercises/practice/atbash-cipher/.meta/spec_generator.moon @@ -0,0 +1,12 @@ +{ + module_name: 'AtbashCipher', + + generate_test: (case, level) -> + lines = { + "result = AtbashCipher.#{case.property} #{quote case.input.phrase}" + "expected = #{quote case.expected}" + "assert.are.equal expected, result" + } + + table.concat [indent line, level for line in *lines], '\n' +} diff --git a/exercises/practice/atbash-cipher/.meta/tests.toml b/exercises/practice/atbash-cipher/.meta/tests.toml new file mode 100644 index 0000000..c082d07 --- /dev/null +++ b/exercises/practice/atbash-cipher/.meta/tests.toml @@ -0,0 +1,52 @@ +# 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. + +[2f47ebe1-eab9-4d6b-b3c6-627562a31c77] +description = "encode -> encode yes" + +[b4ffe781-ea81-4b74-b268-cc58ba21c739] +description = "encode -> encode no" + +[10e48927-24ab-4c4d-9d3f-3067724ace00] +description = "encode -> encode OMG" + +[d59b8bc3-509a-4a9a-834c-6f501b98750b] +description = "encode -> encode spaces" + +[31d44b11-81b7-4a94-8b43-4af6a2449429] +description = "encode -> encode mindblowingly" + +[d503361a-1433-48c0-aae0-d41b5baa33ff] +description = "encode -> encode numbers" + +[79c8a2d5-0772-42d4-b41b-531d0b5da926] +description = "encode -> encode deep thought" + +[9ca13d23-d32a-4967-a1fd-6100b8742bab] +description = "encode -> encode all the letters" + +[bb50e087-7fdf-48e7-9223-284fe7e69851] +description = "decode -> decode exercism" + +[ac021097-cd5d-4717-8907-b0814b9e292c] +description = "decode -> decode a sentence" + +[18729de3-de74-49b8-b68c-025eaf77f851] +description = "decode -> decode numbers" + +[0f30325f-f53b-415d-ad3e-a7a4f63de034] +description = "decode -> decode all the letters" + +[39640287-30c6-4c8c-9bac-9d613d1a5674] +description = "decode -> decode with too many spaces" + +[b34edf13-34c0-49b5-aa21-0768928000d5] +description = "decode -> decode with no spaces" diff --git a/exercises/practice/atbash-cipher/atbash_cipher.moon b/exercises/practice/atbash-cipher/atbash_cipher.moon new file mode 100644 index 0000000..60d9da2 --- /dev/null +++ b/exercises/practice/atbash-cipher/atbash_cipher.moon @@ -0,0 +1,7 @@ +{ + encode: (phrase) -> + error 'Implement me' + + decode: (phrase) -> + error 'Implement me' +} diff --git a/exercises/practice/atbash-cipher/atbash_cipher_spec.moon b/exercises/practice/atbash-cipher/atbash_cipher_spec.moon new file mode 100644 index 0000000..c4b15de --- /dev/null +++ b/exercises/practice/atbash-cipher/atbash_cipher_spec.moon @@ -0,0 +1,74 @@ +AtbashCipher = require 'atbash_cipher' + +describe 'atbash-cipher', -> + describe 'encode', -> + it 'encode yes', -> + result = AtbashCipher.encode 'yes' + expected = 'bvh' + assert.are.equal expected, result + + pending 'encode no', -> + result = AtbashCipher.encode 'no' + expected = 'ml' + assert.are.equal expected, result + + pending 'encode OMG', -> + result = AtbashCipher.encode 'OMG' + expected = 'lnt' + assert.are.equal expected, result + + pending 'encode spaces', -> + result = AtbashCipher.encode 'O M G' + expected = 'lnt' + assert.are.equal expected, result + + pending 'encode mindblowingly', -> + result = AtbashCipher.encode 'mindblowingly' + expected = 'nrmwy oldrm tob' + assert.are.equal expected, result + + pending 'encode numbers', -> + result = AtbashCipher.encode 'Testing,1 2 3, testing.' + expected = 'gvhgr mt123 gvhgr mt' + assert.are.equal expected, result + + pending 'encode deep thought', -> + result = AtbashCipher.encode 'Truth is fiction.' + expected = 'gifgs rhurx grlm' + assert.are.equal expected, result + + pending 'encode all the letters', -> + result = AtbashCipher.encode 'The quick brown fox jumps over the lazy dog.' + expected = 'gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt' + assert.are.equal expected, result + + describe 'decode', -> + pending 'decode exercism', -> + result = AtbashCipher.decode 'vcvix rhn' + expected = 'exercism' + assert.are.equal expected, result + + pending 'decode a sentence', -> + result = AtbashCipher.decode 'zmlyh gzxov rhlug vmzhg vkkrm thglm v' + expected = 'anobstacleisoftenasteppingstone' + assert.are.equal expected, result + + pending 'decode numbers', -> + result = AtbashCipher.decode 'gvhgr mt123 gvhgr mt' + expected = 'testing123testing' + assert.are.equal expected, result + + pending 'decode all the letters', -> + result = AtbashCipher.decode 'gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt' + expected = 'thequickbrownfoxjumpsoverthelazydog' + assert.are.equal expected, result + + pending 'decode with too many spaces', -> + result = AtbashCipher.decode 'vc vix r hn' + expected = 'exercism' + assert.are.equal expected, result + + pending 'decode with no spaces', -> + result = AtbashCipher.decode 'zmlyhgzxovrhlugvmzhgvkkrmthglmv' + expected = 'anobstacleisoftenasteppingstone' + assert.are.equal expected, result