Merge Go Work
This commit is contained in:
46
go/atbash-cipher/README.md
Normal file
46
go/atbash-cipher/README.md
Normal file
@@ -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.
|
||||
|
36
go/atbash-cipher/atbash.go
Normal file
36
go/atbash-cipher/atbash.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package atbash
|
||||
|
||||
import "strings"
|
||||
|
||||
func Atbash(s string) string {
|
||||
s = strings.ToLower(s)
|
||||
var v []byte
|
||||
var b, iter int
|
||||
for i := range s {
|
||||
sv := int(s[i])
|
||||
switch {
|
||||
case sv < 48:
|
||||
continue
|
||||
case sv >= 48 && sv <= 57:
|
||||
b = sv
|
||||
case sv < 109:
|
||||
b = 110 + (109 - sv)
|
||||
case sv == 109:
|
||||
b = 110
|
||||
case sv == 110:
|
||||
b = 109
|
||||
case sv > 110:
|
||||
b = 109 - (sv - 110)
|
||||
}
|
||||
v = append(v, byte(b))
|
||||
iter++
|
||||
if iter == 5 {
|
||||
v = append(v, ' ')
|
||||
iter = 0
|
||||
}
|
||||
}
|
||||
if iter == 0 {
|
||||
return string(v)[:len(string(v))-1]
|
||||
}
|
||||
return string(v)
|
||||
}
|
40
go/atbash-cipher/atbash_cipher_test.go
Normal file
40
go/atbash-cipher/atbash_cipher_test.go
Normal file
@@ -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()
|
||||
}
|
||||
}
|
BIN
go/atbash-cipher/cmd/cmd
Executable file
BIN
go/atbash-cipher/cmd/cmd
Executable file
Binary file not shown.
11
go/atbash-cipher/cmd/main.go
Normal file
11
go/atbash-cipher/cmd/main.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"../../atbash-cipher"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(atbash.Atbash("mindblowingly"))
|
||||
}
|
Reference in New Issue
Block a user