summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-08-27 16:56:02 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-08-27 16:56:02 +0200
commite6fc4f9d5b2116b187da38d49629a0637b954d39 (patch)
treec0078342432612d59ea7b61805583051b449c146
parentc00da54ecddabb9e218029466bb35bca040b87fb (diff)
Add crypto square
-rw-r--r--go/crypto-square/README.md87
-rw-r--r--go/crypto-square/crypto_square_test.go108
2 files changed, 195 insertions, 0 deletions
diff --git a/go/crypto-square/README.md b/go/crypto-square/README.md
new file mode 100644
index 0000000..8ce9bd9
--- /dev/null
+++ b/go/crypto-square/README.md
@@ -0,0 +1,87 @@
+# Crypto Square
+
+Implement the classic method for composing secret messages called a square code.
+
+Write a program that, given an English text, outputs the encoded version
+of that text.
+
+First, the input is normalized: the spaces and punctuation are removed
+from the English text and the message is downcased.
+
+Then, the normalized characters are broken into rows. These rows can be
+regarded as forming a rectangle when printed with intervening newlines.
+
+For example, the sentence
+
+> If man was meant to stay on the ground, god would have given us roots.
+
+is normalized to:
+
+> ifmanwasmeanttostayonthegroundgodwouldhavegivenusroots
+
+The plaintext should be organized in to a rectangle. The size of the
+rectangle (`r x c`) should be decided by the length of the message,
+such that `c >= r` and `c - r <= 1`, where `c` is the number of columns
+and `r` is the number of rows.
+
+Our normalized text is 54 characters long, dictating a rectangle with
+`c = 8` and `r = 7`:
+
+```plain
+ifmanwas
+meanttos
+tayonthe
+groundgo
+dwouldha
+vegivenu
+sroots
+```
+
+The coded message is obtained by reading down the columns going left to
+right.
+
+The message above is coded as:
+
+```plain
+imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau
+```
+
+Output the encoded text in chunks. Phrases that fill perfect squares
+`(r X r)` should be output in `r`-length chunks separated by spaces.
+Imperfect squares will have `n` empty spaces. Those spaces should be distributed evenly across the last `n` rows.
+
+```plain
+imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau
+```
+
+Notice that were we to stack these, we could visually decode the
+cyphertext back in to the original message:
+
+```plain
+imtgdvs
+fearwer
+mayoogo
+anouuio
+ntnnlvt
+wttddes
+aohghn
+sseoau
+```
+
+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
+
+J Dalbey's Programming Practice problems [http://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html](http://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html)
+
+## 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/crypto-square/crypto_square_test.go b/go/crypto-square/crypto_square_test.go
new file mode 100644
index 0000000..75a3582
--- /dev/null
+++ b/go/crypto-square/crypto_square_test.go
@@ -0,0 +1,108 @@
+package cryptosquare
+
+import "testing"
+
+const targetTestVersion = 2
+
+var tests = []struct {
+ pt string // plain text
+ ct string // cipher text
+}{
+ {
+ "s#$%^&plunk",
+ "su pn lk",
+ },
+ {
+ "1, 2, 3 GO!",
+ "1g 2o 3",
+ },
+ {
+ "1234",
+ "13 24",
+ },
+ {
+ "123456789",
+ "147 258 369",
+ },
+ {
+ "123456789abc",
+ "159 26a 37b 48c",
+ },
+ {
+ "Never vex thine heart with idle woes",
+ "neewl exhie vtetw ehaho ririe vntds",
+ },
+ {
+ "ZOMG! ZOMBIES!!!",
+ "zzi ooe mms gb",
+ },
+ {
+ "Time is an illusion. Lunchtime doubly so.",
+ "tasney inicds miohoo elntu illib suuml",
+ },
+ {
+ "We all know interspecies romance is weird.",
+ "wneiaw eorene awssci liprer lneoid ktcms",
+ },
+ {
+ "Madness, and then illumination.",
+ "msemo aanin dnin ndla etlt shui",
+ },
+ {
+ "Vampires are people too!",
+ "vrel aepe mset paoo irpo",
+ },
+ {
+ "",
+ "",
+ },
+ {
+ "1",
+ "1",
+ },
+ {
+ "12",
+ "1 2",
+ },
+ {
+ "12 3",
+ "13 2",
+ },
+ {
+ "12345678",
+ "147 258 36",
+ },
+ {
+ "123456789a",
+ "159 26a 37 48",
+ },
+ {
+ "If man was meant to stay on the ground god would have given us roots",
+ "imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau",
+ },
+ {
+ "Have a nice day. Feed the dog & chill out!",
+ "hifei acedl veeol eddgo aatcu nyhht",
+ },
+}
+
+func TestEncode(t *testing.T) {
+ if testVersion != targetTestVersion {
+ t.Errorf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
+ }
+ for _, test := range tests {
+ if ct := Encode(test.pt); ct != test.ct {
+ t.Fatalf(`Encode(%q):
+got %q
+want %q`, test.pt, ct, test.ct)
+ }
+ }
+}
+
+func BenchmarkEncode(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ for _, test := range tests {
+ Encode(test.pt)
+ }
+ }
+}