summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-08-30 02:05:53 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-08-30 02:05:53 +0200
commit89539daca2be78d19e36e0f5b952d3ec259c8e78 (patch)
treec53d21d07c628c0d48c056cca40df648fe79bfe2
parentbfb81139b65cd99b4a231e42a810214388194ec7 (diff)
Solve Atbash
-rw-r--r--go/atbash-cipher/README.md46
-rw-r--r--go/atbash-cipher/atbash_cipher.go23
-rw-r--r--go/atbash-cipher/atbash_cipher_test.go40
3 files changed, 109 insertions, 0 deletions
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()
+ }
+}