From 89539daca2be78d19e36e0f5b952d3ec259c8e78 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 30 Aug 2016 02:05:53 +0200 Subject: Solve Atbash --- go/atbash-cipher/README.md | 46 ++++++++++++++++++++++++++++++++++ go/atbash-cipher/atbash_cipher.go | 23 +++++++++++++++++ go/atbash-cipher/atbash_cipher_test.go | 40 +++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 go/atbash-cipher/README.md create mode 100644 go/atbash-cipher/atbash_cipher.go create mode 100644 go/atbash-cipher/atbash_cipher_test.go diff --git a/go/atbash-cipher/README.md b/go/atbash-cipher/README.md new file mode 100644 index 0000000..939c038 --- /dev/null +++ b/go/atbash-cipher/README.md @@ -0,0 +1,46 @@ +# Atbash Cipher + +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: + +```plain +Plain: abcdefghijklmnopqrstuvwxyz +Cipher: zyxwvutsrqponmlkjihgfedcba +``` + +It is a very weak cipher because it only has one possible key, and it is +a simple monoalphabetic 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, and punctuation is excluded. This is to make it harder to guess +things based on word boundaries. + +## Examples +- Encoding `test` gives `gvhg` +- Decoding `gvhg` gives `test` +- Decoding `gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt` gives `The quick brown fox jumps over the lazy dog.` + +To run the tests simply run the command `go test` in the exercise directory. + +If the test suite contains benchmarks, you can run these with the `-bench` +flag: + + go test -bench . + +For more detailed info about the Go track see the [help +page](http://exercism.io/languages/go). + +## Source + +Wikipedia [http://en.wikipedia.org/wiki/Atbash](http://en.wikipedia.org/wiki/Atbash) + +## Submitting Incomplete Problems +It's possible to submit an incomplete solution so you can see how others have completed the exercise. + diff --git a/go/atbash-cipher/atbash_cipher.go b/go/atbash-cipher/atbash_cipher.go new file mode 100644 index 0000000..34f94f0 --- /dev/null +++ b/go/atbash-cipher/atbash_cipher.go @@ -0,0 +1,23 @@ +package atbash + +import "unicode" + +func Atbash(s string) string { + r := []rune{} + for _, v := range s { + switch { + case unicode.IsLetter(v): + r = append(r, 'z'-unicode.ToLower(v)+'a') + case unicode.IsNumber(v): + r = append(r, v) + } + } + ret := []rune{} + for i, v := range r { + ret = append(ret, v) + if (i+1)%5 == 0 && i != len(r)-1 { + ret = append(ret, ' ') + } + } + return string(ret) +} diff --git a/go/atbash-cipher/atbash_cipher_test.go b/go/atbash-cipher/atbash_cipher_test.go new file mode 100644 index 0000000..08f274e --- /dev/null +++ b/go/atbash-cipher/atbash_cipher_test.go @@ -0,0 +1,40 @@ +package atbash + +import "testing" + +var tests = []struct { + expected string + s string +}{ + {"ml", "no"}, + {"ml", "no"}, + {"bvh", "yes"}, + {"lnt", "OMG"}, + {"lnt", "O M G"}, + {"nrmwy oldrm tob", "mindblowingly"}, + {"gvhgr mt123 gvhgr mt", "Testing, 1 2 3, testing."}, + {"gifgs rhurx grlm", "Truth is fiction."}, + {"gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt", "The quick brown fox jumps over the lazy dog."}, +} + +func TestAtbash(t *testing.T) { + for _, test := range tests { + actual := Atbash(test.s) + if actual != test.expected { + t.Errorf("Atbash(%s): expected %s, actual %s", test.s, test.expected, actual) + } + } +} + +func BenchmarkAtbash(b *testing.B) { + b.StopTimer() + for _, test := range tests { + b.StartTimer() + + for i := 0; i < b.N; i++ { + Atbash(test.s) + } + + b.StopTimer() + } +} -- cgit v1.2.3